PHP cURL'致命错误:大数据集的允许内存大小'

时间:2010-08-26 18:36:23

标签: php memory-leaks curl large-data-volumes

我知道设置内部存储器的选项

ini_set("memory_limit","30M");

但我想知道是否有更好的方法来查询数据?

我有一个WHILE LOOP,检查我是否需要查询另外1000条记录。 使用偏移量作为起始记录号和限制作为返回记录,我搜索与我的数据请求匹配的所有记录。在我收到错误之前,我在记录中达到了大约100K。

现在在测试期间,我发现我收到'致命错误:允许的内存大小...'错误。我已经通过设置上面的ini_set()来阅读以允许增加内存,但我想知道我是否可以更好地编码它?

每次我在WHILE LOOP中执行下面的代码时,内存使用量会变得非常大。即使我没有设置($ curl)。我认为如果我在下一次cURL查询之前解析结果后可以取消设置$ result和$ curl变量,可以减少它。

function getRequest($url,$user,$pwd) {

    $curl = curl_init();

    curl_setopt($curl, CURLOPT_VERBOSE, 1);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 2);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_USERPWD, "$user:$pwd");
    curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($curl, CURLOPT_ENCODING, '');
    curl_setopt($curl, CURLOPT_URL, $url);

    $result = curl_exec($curl);

    $httpResponseCode = (int)curl_getinfo($curl, CURLINFO_HTTP_CODE);

    switch ($httpResponseCode) {
        case 500:
            // Send problem email
            break;
        case 200:
            // GET was good
            break;
        default:
            // Send problem email
            break;
    }    
    curl_close($curl);
    return $result;
} 

WHILE LOOP(超薄版)

while($queryFlag) { // $queryFlag is TRUE

        // Check if we have more records to query, if not set $queryFlag to FALSE

        // Build cURL URL

        echo "Before Call Memory Usage: ".memory_get_usage()."\n";
        $resultXML  = getRequest($query,$user,$pass);
        echo "After Call Memory Usage: ".memory_get_usage()."\n";

        $results        = new ParseXMLConfig((string)$resultXML); // This is basically a class for $this->xml = simplexml_load_string($xml);

        // Loop through results and keep what  I'm looking for
        foreach($results as $resultsKey => $resultsData) {
            if(preg_match('|^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$|i', $resultsData)) {
                $resultsArr["$resultsData"] = $resultsData;
            }
        }

    }

一些内存编号

  • 致电记忆用法之前:1819736
  • 致电内存使用后:2285344
  • 保留我需要的数据
  • 转储数据我不需要
  • 下一步循环迭代
  • 致电内存使用前:2084128
  • 致电内存使用后:2574952

2 个答案:

答案 0 :(得分:0)

您使用的$resultsArr错误的。您使用相同的字符串作为键和值。

尝试更改

$resultsArr["$resultsData"] = $resultsData

$resultsArr[$resultsKey] = $resultsData

答案 1 :(得分:0)

定居:

ini_set("memory_limit","30M");