file_get_contents()是否有超时设置?
我正在循环中使用file_get_contents()
方法调用一系列链接。 每个环节可能需要15分钟以上的时间来处理。 现在,我担心PHP的file_get_contents()
是否有超时期限?
如果是的话,它会超时打电话,并移动到下一个链接。 我不想在没有事先完成的情况下打电话给下一个环节。
所以,请告诉我file_get_contents()
是否有超时期限。 包含file_get_contents()
的文件被设置为set_time_limit()
为零(无限)。
默认超时时间由default_socket_timeout
ini-setting定义,为60秒。 您也可以在飞行中更改它:
ini_set('default_socket_timeout', 900); // 900 Seconds = 15 Minutes
设置超时的另一种方法是使用stream_context_create
将超时设置为正在使用的HTTPstream包装器的 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_CONNECTTIMEOUT, $timeout); $result=curl_exec($ch); curl_close($ch); echo $result;
值得注意的是,如果在运行时更改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);
对于我来说,当我在我的主机中更改我的php.ini时:
; Default timeout for socket based streams (seconds) default_socket_timeout = 300