[PHP]sleep中にアクセスできないのはsessionが原因かも
スクレイピングで5秒おきに特定のURLにアクセスするプログラム書いていたのですが、
一度処理を始めると、処理が終わるまで、ブラウザの他のタブからアクセスできない状態となってしまいました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php session_start(); $urls = [ 'http://example1.com/', 'http://example2.com/', 'http://example3.com/', 'http://example4.com/', ]; $data = []; foreach ($urls as $url){ sleep(5); array_push($data, file_get_contents($url)); } var_dump($data); |
原因はsleepの前にセッションを利用していたためで、破損を防ぐためにセッションファイルをロックしてしまうようです。
参照サイト
PHP: session_start – Manual
http://php.net/manual/ja/function.session-start.php#110649
よって、session_write_close()を使用しセッションを閉じることでアクセス可能となりました。
修正後
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php session_start(); $urls = [ 'http://example1.com/', 'http://example2.com/', 'http://example3.com/', 'http://example4.com/', ]; $data = []; session_write_close();//セッションを閉じる foreach ($urls as $url){ sleep(5); array_push($data, file_get_contents($url)); } session_start();//セッションを再開 var_dump($data); |
ただし、この現象はブラウザからスクレーパーを起動し、そのブラウザで同じドメインのウェブサイトにアクセスした場合のみで起きると思うので、無理に修正する必要はないかもしれません。