1

我有这个从页面列表中获取 html 的函数,一旦我运行它两个小时左右,脚本就会中断并显示已超出内存限制,现在我试图取消设置/设置为 null 一些变量,希望能释放一些内存,但这是同样的问题。各位大佬能看一下下面的代码吗?:

{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    if ($proxystatus == 'on'){
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
        curl_setopt($ch, CURLOPT_PROXY, $proxy);
    }
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
    curl_setopt($ch, CURLOPT_URL, $site);
    ob_start();
    return curl_exec($ch); // the line the script interrupts because of memory
    ob_end_clean();
    curl_close($ch);

    ob_flush();
    $site = null;
    $ch = null;

}

任何建议都受到高度赞赏。我已将内存限制设置为 128M,但在增加它之前(对我来说似乎不是最好的选择)我想知道在运行脚本时是否可以做些什么来使用更少的内存/释放内存。

谢谢你。

4

3 回答 3

1

您确实在泄漏内存。请记住,return立即结束当前函数的执行,因此您的所有清理(最重要的是ob_end_clean()and curl_close())永远不会被调用。

return应该是函数所做的最后一件事。

于 2013-02-04T14:06:39.907 回答
1

我知道已经有一段时间了,但其他人可能会遇到类似的问题,所以如果它可以帮助其他人......对我来说,这里的问题是 curl 被设置为将输出保存到字符串。[这就是curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);] 如果输出太长,脚本将用完该字符串的允许内存。[返回类似FATAL ERROR: Allowed memory size of 134217728 bytes exhausted (tried to allocate 130027520 bytes)] 的错误解决方法是使用 curl 提供的其他输出方法之一:输出到标准输出,或输出到文件。在任何一种情况下,都不需要 ob-start 。

因此,您可以使用以下任一选项替换大括号的内容:

选项 1:输出到标准输出:

$ch = curl_init();
if ($proxystatus == 'on'){
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
    curl_setopt($ch, CURLOPT_PROXY, $proxy);
}
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($ch, CURLOPT_URL, $site);
curl_exec($ch);
curl_close($ch);

选项 2:输出到文件:

$file = fopen("path_to_file", "w"); //place this outside the braces if you want to output the content of all iterations to the same file
$ch = curl_init();
if ($proxystatus == 'on'){
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
    curl_setopt($ch, CURLOPT_PROXY, $proxy);
}
curl_setopt($curl, CURLOPT_FILE, $file);    
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($ch, CURLOPT_URL, $site);
curl_exec($ch);
curl_close($ch);
fclose($file);  //place this outside of the braces if you want to output the content of all iterations to the same file
于 2021-02-12T12:06:40.870 回答
0

确定这不是 cURL 问题。使用诸如 xdebug 之类的工具来检测脚本的哪一部分正在消耗内存。

顺便说一句,我还将它更改为不运行两个小时,我会将它移动到每分钟运行的 cronjob,检查它需要什么然后停止。

于 2013-02-04T13:00:26.263 回答