より大きなファイルの致命的なエラーを生成するのを防ぎます
-
28-09-2019 - |
質問
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, like Gecko) Chrome/5.0.307.11 Safari/532.9"; curl_setopt($ch,CURLOPT_HTTPHEADER,array ( "Accept: 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_setopt($ ch、curlopt_timeout、3);これは、ロードに3秒以上かかるファイルが許可されたメモリを使い果たすと想定していますが、これは満足のいくものではありません。
解決
使用してみましたか CURLOPT_FILE
ファイルをメモリを使用する代わりにディスクに直接保存するには?指定することもできます /dev/null
どこにも置くために...
または、使用できます CURLOPT_WRITEFUNCTION
カスタムデータライティング関数を設定します。関数にヘッダーをスキャンするだけで、実際のデータを捨てます。
あるいは、PHPにもう少しメモリを介して与えます php.ini
.
他のヒント
ヘッダー情報を取得している場合は、なぜ使用してみませんか HEAD
リクエスト?これにより、ページ全体をMaximumn 16mibメモリスロットで取得するというメモリの使用が回避されます。
curl_setopt($ch, CURLOPT_HEADER, true);
次に、ページタイトルで使用します file_get_contents()
代わりに、ネイティブメモリの割り当てによりはるかに優れているためです。