こんにちは、なめこです。
Goutteで怖い目にあいました(といってもGoutteが原因かは不明)
Goutte
https://github.com/fabpot/goutte
レンタルサーバ(エックスサーバ)でスクレイピングツールを作ってます。
$pram = POST値
$url = 対象URL
// ユーザーエージェントの取得
$useragent = HttpHeaderUtil::getUserAgent();
$client = new Client(['HTTP_USER_AGENT'=>$useragent, 'HTTP_ACCEPT-LANGUAGE'=>'ja,en']);
$options = JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT | JSON_PRETTY_PRINT;
echo $datetime . '開始だよ!';
$client->request('POST', $url, array(), array(), array('HTTP_CONTENT_TYPE' => 'application/json'), json_encode($param, $options));
echo $datetime . '終了だよ!';
$response = $client->getResponse();
$c = $response->getContent();
$c->seek(0);
$c = $c->getContents();
上記はJSONをPOSTして、JSONを返却してくるAPIをスクレイピングしたときの例です。
(WebAPIなのでGoutteでやる意味あんのか!?)
たくさんアクセスするので、上記のようなコードをぐるぐる回す感じです。
さてさて、プログラムを動作させて5時間後?ぐらいでしょうか
ふとログを見ると
~~~省略~~~
10/27 20:00 開始だよ!
10/27 20:03 終了だよ!
10/27 20:03 開始だよ!
10/27 20:04 終了だよ!
10/27 20:05 開始だよ!
あれ・・・途中でとまってる。
現在の時刻は・・・10/27 23:00
え!?3時間も止まってるの!?
もちろん、エラー出力もありませんし、プロセスはちゃんと生きてます。(ただしプロセスのメモリの変動は止まったまま)
$client->requestの部分は
Symfony\Component\BrowserKit\Clientにあるメソッドです
Goutte自体はうまい感じにライブラリをラップしてるだけなので、Goutteが悪いわけではないと思います。
妄想ですが、
どっかで無限ループに陥るのかもしれません
外部ライブラリにデバッグ文埋め込むまではしていないので、確実な理由はわかりませんが、
requestメソッドの前後にログを入れたので、たしかにそこで応答が返ってこない現象が起きています。
長時間スクレイピングでこの事象に何回か遭遇し、Goutteが怖くなりました(Goutteのせいじゃない)
なのでcurlでスクレイピング処理を書き直したところ、問題は解決しました。(Goutteを使わない)
誰かこの現象になった人いないかな?