2016-08-02 3 views
1

У меня есть этот код:PHP memory_limit фатальная ошибка в array_search функции

<?php 
header('Content-Type: text/html; charset=utf-8'); 
error_reporting(E_ERROR | E_WARNING | E_PARSE & ~E_NOTICE); 
$uarray = json_decode($_POST['array']); 

$uac = $uarray; 
$res = $uarray; 

function request_callback($response, $info, $request) { 
global $uac; 
global $res; 
$index = array_search($request->{'url'}, $uac); 
$uac[$index] = " "; 
$rspnc = json_decode($response); 
$res[$index] = $rspnc; 
} 

require("RollingCurl.php"); 

$rc = new RollingCurl("request_callback"); 
$rc->options = array(CURLOPT_BINARYTRANSFER => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false); 
$rc->window_size = 5; 
foreach ($uarray as $url) { 
$request = new RollingCurlRequest($url); 
$rc->add($request); 
} 
$rc->execute(); 

for($i = 0; $i <= count($res); $i++) 
{ 
for ($j = 0; $j <= 1; $j++) { 
echo $res[$i]->{'name'}; 
echo "/"; 
echo $res[$i]->{'quality'}; 
echo "/"; 
echo $res[$i]->{'buy_offers'}[$j]->{'o_price'}; 
echo "/"; 
echo $res[$i]->{'buy_offers'}[$j]->{'c'}; 
echo "/"; 
echo $res[$i]->{'buy_offers'}[$j]->{'my_count'}; 
echo "/"; 
echo $res[$i]->{'classid'}. "_" .$res[$i]->{'instanceid'}; 
echo "<br>"; 
} 
echo "<p><p><p>"; 
} 
?> 

И им получить предел памяти ошибки в этой строке:

$index = array_search($request->{'url'}, $uac); 

Массив $ uarray содержит 10000 ссылок. Я уже изменил значение memory_limit в php.in на -1. phpinfo(), отображающий значение memory_limit как -1. Поэтому я предполагаю, что ошибка произошла из-за 32-битного PHP и Apache. У меня есть 64-битные окна с 16 ГБ оперативной памяти. Так проблема в коде. Помогите мне переписать этот код, особенно функцию array_search, таким образом, чтобы исходный массив был нарезан и слит обратно. Извините за мой язык.

+0

[ссылка] http://stackoverflow.com/questions/18942839/ php-understanding-memory-limit-error вы можете проверить это .. может быть, это поможет –

+0

Вы также можете попробовать http://www.anindya.com/ Сначала я бы попробовал ссылку на сообщение от Tejas. – reporter

ответ

0

В этом случае лучше отправить данные как тело и прочитать его с php://input короткими частями. Если каждая строка будет разделена на \n (например), вы можете читать строки за строкой. Таким образом, вы можете избежать загрузки всех данных из потока в массив $uarray.

Например, запрос песок со следующим телом:

[ 
    {"name":"name1","quality":"1"}, 
    {"name":"name2","quality":"2"} 
] 

Вы можете прочитать его построчно:

$handle = fopen('php://input', 'r'); 
do { 
    $str = fgets($handle); 
    $data = json_decode($str); 
    if ($data) { 
     // do what you need 
     echo $data->name . PHP_EOL; 
     echo $data->quality . PHP_EOL; 
    } 
} while ($str); 
+0

извините, но я не полностью undrestand, что вы имеете в виду. может у вставить небольшой код или что-то еще? –

+0

Я обновил ответ – mnv

Смежные вопросы