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