2012-04-19 86 views
113

我正在使用循環中的file_get_contents()方法調用一系列鏈接。每個鏈接可能需要超過15分鐘才能處理。現在,我擔心PHP的file_get_contents()是否有超時期限?file_get_contents()是否有超時設置?

如果是,它將超時通話並移動到下一個鏈接。我不想在沒有事先完成的情況下撥打下一個鏈接。

那麼,請告訴我file_get_contents()是否有超時時間。包含file_get_contents()的文件設置爲set_time_limit()爲零(無限制)。

+0

交叉參考:您的file_get_contents通話後,從遠程服務器檢索文件時,[延遲處理PHP](http://stackoverflow.com/q/1605063/367456) – hakre 2014-01-12 09:54:45

+0

我在使用Visual Studio的PHP工具的Visual Studio PHP項目中經歷了同樣的行爲(在同一個「服務器」上查詢URL時的超時) Studio擴展。 [更多信息在這裏](http://support.devsense.com/viewtopic.php?f=21&t=1916)。 – 2016-10-31 10:24:02

+0

使用[內置PHP服務器查詢同一網站上的URL](https://bugs.php.net/bug.php?id=63102)時也會發生這種情況,因爲它是單線程的Web服務器。 – 2016-10-31 10:34:36

回答

225

默認超時由default_socket_timeout ini-setting定義,即60秒。你也可以改變它的飛行:

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

另一種方法來設置超時,是使用stream_context_create,設置超時時間在使用HTTP stream wrapperHTTP context options

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

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

您可以提供有關如何爲https url設置超時的信息嗎? – Vinay 2013-05-29 13:35:32

+8

這件事情並不完美,如果你的價值是1200,其實是2400.我只是測試它。 – TomSawyer 2013-10-26 15:46:30

+13

default_socket_timeout,stream_set_timeout和stream_context_create超時都是每行讀/寫的超時,而不是整個連接超時。 – diyism 2014-11-04 08:27:18

22

由於@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; 
+1

這個答案給出了另一種控制連接超時的方法(使用'fsockopen'而不是'curl'):http://stackoverflow.com/a/3690321/1869825 – stevo 2015-04-07 19:51:35

+1

你應該在curl中設置CURLOPT_CONNECTTIMEOUT和CURLOPT_TIMEOUT。請參閱http://stackoverflow.com/a/27776164/1863432 – bhelm 2016-05-02 13:36:23

1

,當我在我的主機改變我的php.ini我工作:

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

值得注意的是,如果在飛行中改變default_socket_timeout,這可能是恢復它的價值是有用

$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);