我file_get_contents()
在循环中使用该方法调用一系列链接。每个链接可能需要超过15分钟的处理时间。现在,我担心PHP是否file_get_contents()
有超时期限?
如果是,它将因通话超时而移至下一个链接。我不想在没有前一个链接完成的情况下调用下一个链接。
所以,请告诉我是否file_get_contents()
有超时时间。包含的文件file_get_contents()
设置为set_time_limit()
为零(无限制)。
我file_get_contents()
在循环中使用该方法调用一系列链接。每个链接可能需要超过15分钟的处理时间。现在,我担心PHP是否file_get_contents()
有超时期限?
如果是,它将因通话超时而移至下一个链接。我不想在没有前一个链接完成的情况下调用下一个链接。
所以,请告诉我是否file_get_contents()
有超时时间。包含的文件file_get_contents()
设置为set_time_limit()
为零(无限制)。
Answers:
默认超时由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超时都是每行读/写的超时,而不是整个连接超时。 ” @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;
是! 通过在第三个参数中传递流上下文:
这里的超时为1s:
file_get_contents("https://abcedef.com", 0, stream_context_create(["http"=>["timeout"=>1]]));
https://www.php.net/manual/zh/function.file-get-contents.php的注释部分中的源
method
header
user_agent
content
request_fulluri
follow_location
max_redirects
protocol_version
timeout
stream_context_create
仅适用于连接超时。如果服务器在给定的超时时间内答复(发送了一些数据),但花了很长时间才发送剩余的有效负载,则此超时不会中断慢速传输。
值得注意的是,如果即时更改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);