file_get_contents()是否有超时设置?

时间:2012-04-19 20:25:17

标签: php timeout file-get-contents

我在循环中使用file_get_contents()方法调用一系列链接。每个链接可能需要15分钟以上才能处理。现在,我担心PHP的file_get_contents()是否有超时期限?

如果是,则会通过电话超时并转到下一个链接。我不想在没有事先完成的情况下调用下一个链接。

所以,请告诉我file_get_contents()是否有超时期限。包含file_get_contents()的文件设置为set_time_limit()为零(无限制)。

6 个答案:

答案 0 :(得分:263)

默认超时由default_socket_timeout ini-setting定义,即60秒。您也可以动态更改它:

ini_set('default_socket_timeout', 900); // 900 Seconds = 15 Minutes

设置超时的另一种方法是使用stream_context_create将超时设置为正在使用的HTTP context optionsHTTP stream wrapper

$ctx = stream_context_create(array('http'=>
    array(
        'timeout' => 1200,  //1200 Seconds is 20 Minutes
    )
));

echo file_get_contents('http://example.com/', false, $ctx);

答案 1 :(得分:28)

正如@diyism所提到的,“ default_socket_timeout,stream_set_timeout和stream_context_create超时是每行读/写的超时,而不是整个连接超时。”并且@stewe的最佳答案失败了我

作为使用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;

答案 2 :(得分:5)

值得注意的是,如果动态更改 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);

答案 3 :(得分:1)

当我在主持人中更改我的php.ini时,对我工作:

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

答案 4 :(得分:1)

是的!通过在第三个参数中传递stream context

此处超时时间为 1s

cout << "The natural numbers are: ";
for (int i = 1; i <= input; i++) {
   cout << i << ' ';
    }

https://www.php.net/manual/en/function.file-get-contents.php的注释部分中的来源

HTTP context options

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

其他上下文: https://www.php.net/manual/en/context.php

答案 5 :(得分:0)

对于原型,将外壳中的curl与-m参数一起使用允许经过毫秒,并且在两种情况下都可以使用,要么连接未启动,错误404、500,错误的URL或整个连接在允许的时间范围内未完全检索到数据,超时始终有效。 Php永远不会挂出

根本不要在shell调用中传递未经消毒的用户数据。

system("curl -m 50 -X GET 'https://api.kraken.com/0/public/OHLC?pair=LTCUSDT&interval=60' -H  'accept: application/json' > data.json");
// This data had been refreshed in less than 50ms
var_dump(json_decode(file_get_contents("data.json"),true));