私はこの問題に苦労しています。
私がフェッチしている本文は、3100 文字という大きなものではありません。サーバーの Apache ログには、コンテンツの長さが 3100 であると記録されています。ただし、curl_multi_getcontent によって返される文字列は 1290 文字に短縮されていました。
通常、curl_multi_getcontent() は正常に動作しますが、時々、この奇妙な動作が発生します。
何か案は?
私はこの問題に苦労しています。
私がフェッチしている本文は、3100 文字という大きなものではありません。サーバーの Apache ログには、コンテンツの長さが 3100 であると記録されています。ただし、curl_multi_getcontent によって返される文字列は 1290 文字に短縮されていました。
通常、curl_multi_getcontent() は正常に動作しますが、時々、この奇妙な動作が発生します。
何か案は?
これは私の尻を蹴った。php5 の (マルチ?)curl システムのバグのようです。ローリングカールのマルチカール lib を使用しているときにこのバグに遭遇しましたが、根本的な問題は php 自体にあるようです。ここに私のphp -vがあります:
PHP 5.3.3-1ubuntu9.3 with Suhosin-Patch (cli) (built: Jan 12 2011 16:07:38)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
状況によっては (私の場合は CURLOPT_TIMEOUT が最大になっていました)、curl_error と curl_errno が curl のエラーを適切に報告しませんでした。curl_multi_info_read によって返された配列の「結果」キーを使用する必要がありました。その結果コードは、curl_err* 関数がすべて正常であると報告したときの実際のエラー番号を教えてくれました。
この問題は次のバグ レポートに関連していると思います: http://bugs.php.net/bug.php?id=52558
私のコードには、進行中の転送のチェックがありませんでした。
転送が進行中の場合:
http_code = 200 errno = 0 download_content_length = total length, e.g. 1M size_download = current position, <= download_content_length
while( curlm_multi_exec == CURLM_CALL_MULTI_PERFORM ) がやや不十分なようです。この URL のサイズが一致するか、multi_exec の 2 番目の引数がすべての URL が終了したことを通知するまで、usleep でループする必要があります。
再現する手順: