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


152

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

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

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



Visual Studio拡張機能のPHPツールを使用するVisual Studio PHPプロジェクト内で、同じ動作(同じ「サーバー」でURLをクエリするときのタイムアウト)を経験しました。詳細はこちら
Uwe Keim

これは、組み込みのPHPサーバーを使用して同じWebサイトのURLをクエリする場合にも発生します。これは、シングルスレッドのWebサーバーだからです。
Uwe Keim 2016年

回答:


297

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

8
https URLのタイムアウトを設定する方法について情報を提供できますか?
Vinay 2013年

11
これは完全には機能しません。値が1200の場合、実際には2400です。テストするだけです。
TomSawyer 2013年

15
default_socket_timeout、stream_set_timeout、およびstream_context_createタイムアウトは、接続タイムアウト全体ではなく、すべての行の読み取り/書き込みのタイムアウトです。
diyism 2014年

32

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

1
この回答は、接続タイムアウトを制御する別のアプローチを提供します(fsockopen代わりにを使用curl):stackoverflow.com/a/3690321/1869825
stevo

2
curlでCURLOPT_CONNECTTIMEOUTとCURLOPT_TIMEOUTの両方を設定する必要があります。stackoverflow.com/a/27776164/1863432を
ヘルム

2
有効な応答ではありません。質問は「file_get_contents」に対するものです。応答は素晴らしいですが、不適切です。
e-info128

8

はい!3番目のパラメーターでストリームコンテキストを渡すことにより:

ここでタイムアウトは1秒です:

file_get_contents("https://abcedef.com", 0, stream_context_create(["http"=>["timeout"=>1]]));

https://www.php.net/manual/en/function.file-get-contents.phpのコメントセクションのソース

HTTPコンテキストオプション

method
header
user_agent
content
request_fulluri
follow_location
max_redirects
protocol_version
timeout

その他のコンテキスト: https : //www.php.net/manual/en/context.php


1
286担当者による回答は機能しませんでしたが、あなたの回答は機能しました:)
VE7JRO

で指定されたタイムアウトはstream_context_create、接続タイムアウトに対してのみ機能します。サーバーが指定されたタイムアウト内に応答(データを送信)しても、残りのペイロードを送信するのに永遠にかかる場合、このタイムアウトによって遅い転送が中断されることはありません。
z80crew

6

オンザフライで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);

1
しかし、ini_setは設定を永続的に設定しないことを知っていますよね?基本的に、スクリプトの4半分は役に立たない
Flash Thunder

2
@FlashThunder前のタイムアウトを必要とするコードの後半でfile_get_contentsへの別の呼び出しがある場合はできません。特定のコードが実行された後、その場で変更された設定をその場で復元することは、一般的に良い習慣です。
リービックネル

1
@FlashThunder呼び出し後にsocket_timeout値を復元することをお勧めします。これにより、同じスクリプト実行で同じ関数を次に呼び出すときにグローバル設定が使用されます。
Pascal Roget、

1

私のホストでphp.iniを変更すると私のために働きます:

; Default timeout for socket based streams (seconds)
default_socket_timeout = 300
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.