array_search函数中的PHP memory_limit致命错误

时间:2016-08-02 13:26:10

标签: php memory memory-leaks fatal-error

我有这段代码:

<?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个网址。我已经将php.in中的memory_limit值更改为-1。 phpinfo()将memory_limit值显示为-1。所以我认为由于32位PHP和Apache而发生错误。我有16位内存的Windows 64位。所以代码中的问题。帮助我重写此代码,尤其是array_search函数,原始数组将被切片并合并回来。抱歉我的语言。

1 个答案:

答案 0 :(得分: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);