关于php:file_get_contents()是否有超时设置?

Does file_get_contents() have a timeout setting?

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

如果是,它将超时通话并转到下一个链接。 如果没有事先完成,我不想打电话给下一个链接。

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


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

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

设置超时的另一种方法是使用stream_context_create将超时设置为正在使用的HTTP流包装器的HTTP上下文选项:

1
2
3
4
5
6
7
$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超时是每行读/写的超时,而不是整个连接超时。" @stewe的最佳答案让我失望。

作为使用file_get_contents的替代方法,您始终可以使用curl超时。

所以这是一个适用于调用链接的工作代码。

1
2
3
4
5
6
7
8
9
10
11
12
$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之后恢复其值可能很有用:

1
2
3
4
5
6
$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时工作:

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