1

ページのリストからhtmlを取得するこの関数があり、2時間ほど実行すると、スクリプトが中断し、メモリ制限を超えたことを示します。うまくいけば、いくつかの変数を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()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 などのツールを使用して、スクリプトのどの部分がメモリを消費しているかを検出します。

ところで、2 時間実行しないように変更することもできます。毎分実行される cronjob に移動し、必要なものを確認してから停止します。

于 2013-02-04T13:00:26.263 に答える