2016.12.23 - Note

[PHP]sleep中にアクセスできないのはsessionが原因かも

Tag:

スクレイピングで5秒おきに特定のURLにアクセスするプログラム書いていたのですが、
一度処理を始めると、処理が終わるまで、ブラウザの他のタブからアクセスできない状態となってしまいました。

<?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()を使用しセッションを閉じることでアクセス可能となりました。

修正後

<?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);

ただし、この現象はブラウザからスクレーパーを起動し、そのブラウザで同じドメインのウェブサイトにアクセスした場合のみで起きると思うので、無理に修正する必要はないかもしれません。

コメントを残す