ループで file_get_contents()
メソッドを使用して一連のリンクを呼び出しています。各リンクの処理には15分以上かかる場合があります。さて、PHPのfile_get_contents()
にタイムアウト期間があるかどうか心配です。
「はい」の場合、呼び出しでタイムアウトし、次のリンクに移動します。前のリンクが終了しない限り、次のリンクを呼び出したくありません。
したがって、file_get_contents()
にタイムアウト期間があるかどうかを教えてください。 file_get_contents()
を含むファイルは set_time_limit()
にゼロ(無制限)に設定されます。
デフォルトのタイムアウトは default_socket_timeout
ini-setting で定義され、60秒です。その場で変更することもできます:
ini_set('default_socket_timeout', 900); // 900 Seconds = 15 Minutes
タイムアウトを設定する別の方法は、 stream_context_create
を使用して、使用中の HTTPストリームラッパー の HTTPコンテキストオプション としてタイムアウトを設定することです。
$ctx = stream_context_create(array('http'=>
array(
'timeout' => 1200, //1200 Seconds is 20 Minutes
)
));
echo file_get_contents('http://example.com/', false, $ctx);
@diyismが述べたように、「default_socket_timeout、stream_set_timeout、およびstream_context_createのタイムアウトは、すべての接続のタイムアウトではなく、すべての行の読み取り/書き込みのタイムアウトです。」.
file_get_contents
を使用する代わりに、常にcurl
をタイムアウト付きで使用できます。
そこで、リンクを呼び出すために機能する作業コードを以下に示します。
$url='http://example.com/';
$ch=curl_init();
$timeout=5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$result=curl_exec($ch);
curl_close($ch);
echo $result;
default_socket_timeoutをオンザフライで変更する場合、file_get_contentsを呼び出した後、その値を復元することが役立つ場合があることに注意してください。
$default_socket_timeout = ini_get('default_socket_timeout');
....
ini_set('default_socket_timeout', 10);
file_get_contents($url);
...
ini_set('default_socket_timeout', $default_socket_timeout);
私のホストでphp.iniを変更すると動作します:
; Default timeout for socket based streams (seconds)
default_socket_timeout = 300