web-dev-qa-db-ja.com

file_get_contents()にはタイムアウト設定がありますか?

ループで file_get_contents() メソッドを使用して一連のリンクを呼び出しています。各リンクの処理には15分以上かかる場合があります。さて、PHPのfile_get_contents()にタイムアウト期間があるかどうか心配です。

「はい」の場合、呼び出しでタイムアウトし、次のリンクに移動します。前のリンクが終了しない限り、次のリンクを呼び出したくありません。

したがって、file_get_contents()にタイムアウト期間があるかどうかを教えてください。 file_get_contents()を含むファイルは set_time_limit() にゼロ(無制限)に設定されます。

136
Flora Clinton

デフォルトのタイムアウトは 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);
263
stewe

@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;
28
Randell

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);
6
Pascal Roget

私のホストでphp.iniを変更すると動作します:

; Default timeout for socket based streams (seconds)
default_socket_timeout = 300
1
Max