4

私はcurlとphpを使用して、特定のURLに関する情報(たとえば、httpステータスコード、mimetype、httpリダイレクトの場所、ページタイトルなど)を見つけています。

  
 $ ch = curl_init($ url);
 $ useragent = "Mozilla / 5.0(X11; U; Linux x86_64; ga-GB)AppleWebKit / 532.9(KHTML、Geckoなど)Chrome / 5.0.307.11 Safari / 532.9";
 curl_setopt($ ch、CURLOPT_HTTPHEADER、array(
        "承認:application / rdf + xml; q = 0.9、application / json; q = 0.6、application / xml; q = 0.5、application / xhtml + xml; q = 0.3、text / html; q = 0.2、* / * ; q = 0.1 "
    ));
 curl_setopt($ ch、CURLOPT_FOLLOWLOCATION、1);
 curl_setopt($ ch、CURLOPT_SSL_VERIFYPEER、FALSE);
 curl_setopt($ ch、CURLOPT_USERAGENT、$ useragent);
 curl_setopt($ ch、CURLOPT_RETURNTRANSFER、1);
 $ content = curl_exec($ ch);
 $ chinfo = curl_getinfo($ ch);
 curl_close($ ch);

これは一般的にうまく機能します。ただし、URLがより大きなファイルを指している場合は、致命的なエラーが発生します。

致命的なエラー:許可された16777216バイトのメモリサイズが使い果たされました(14421576バイトを割り当てようとしました)

これを防ぐ方法はありますか?たとえば、ファイルが大きすぎる場合はあきらめるようにcurlに指示するか、エラーをキャッチしますか?

回避策として、追加しました

curl_setopt($ ch、CURLOPT_TIMEOUT、3); これは、ロードに3秒以上かかるファイルは、許可されたメモリを使い果たすと想定していますが、これでは十分とは言えません。

4

2 に答える 2

2

CURLOPT_FILEメモリを使用する代わりに、ファイルをディスクに直接保存するためにを使用してみましたか?どこにも配置しないように指定することもできます/dev/null...

CURLOPT_WRITEFUNCTIONまたは、カスタムデータ書き込み機能を設定するために使用できます。関数にヘッダーをスキャンしてから実際のデータを破棄するようにします。

または、を介してPHPにメモリを追加しますphp.ini

于 2010-08-14T01:18:13.453 に答える
0

ヘッダー情報を取得している場合は、HEADリクエストを使用してみませんか?これにより、ページ全体を最大16MiBのメモリスロットに収めるというメモリ使用量を回避できます。

curl_setopt($ch, CURLOPT_HEADER, true);

次に、ページタイトルにfile_get_contents()代わりに使用します。これは、ネイティブメモリ割り当ての方がはるかに優れているためです。

于 2010-08-14T01:20:46.533 に答える