是否file_get_contents()函数有一个超时设置?是否file_get_contents

2019-05-13 14:09发布

我打电话了一系列使用链接file_get_contents()在一个循环的方法。 每条链路可以采取超过15分钟来处理。 现在,我担心PHP的是否file_get_contents()有一个超时时间?

如果是的话,它就会超时与呼叫并移动到下一个环节。 我不想打电话给下一环节事先没有一个整理。

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

Answer 1:

默认超时由下式定义default_socket_timeout INI设定 ,这是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);


Answer 2:

作为@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;


Answer 3:

值得注意的是,如果在飞行中改变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);


Answer 4:

因为当我改变我的php.ini在我的主机我工作:

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


文章来源: Does file_get_contents() have a timeout setting?