file_get_contents() 是否有超时设置?

2022-08-30 06:33:33

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

如果是,它将通过调用超时并移动到下一个链接。我不想在没有完成前一个链接的情况下调用下一个链接。

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


答案 1

默认超时由 default_socket_timeout ini-set 定义,即 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);

答案 2

正如@diyism提到的,“default_socket_timeout、stream_set_timeout和stream_context_create超时都是每行读/写超时,而不是整个连接超时。@stewe的顶级答案让我失望了。

作为 使用 的替代方法,您始终可以在超时的情况下使用。file_get_contentscurl

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

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

推荐