File _ get _ content ()是否有超时设置?

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

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

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

168262 次浏览

默认的超时是由 default_socket_timeout接口设置定义的,也就是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);

正如@diyism 提到的,“ Default _ socket _ timeout、 stream _ set _ timeout 和 stream _ context _ create timeout 都是每行读/写的超时,而不是整个连接超时。”和@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;

对于我来说,当我在主机中更改 php.ini 时:

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

值得注意的是,如果动态更改 Default _ socket _ timeout,那么在您的 File _ get _ content调用之后恢复它的值可能是有用的:

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

是的! 通过在第三个参数中传递一个 流上下文:

这里是 < strong > 1s 的暂停:

file_get_contents("https://abcedef.com", 0, stream_context_create(["http"=>["timeout"=>1]]));

资料来源于 https://www.php.net/manual/en/function.file-get-contents.php的评论部分

HTTP 上下文选项 :

method
header
user_agent
content
request_fulluri
follow_location
max_redirects
protocol_version
timeout

非 HTTP 流上下文

Socket
FTP
SSL
CURL
Phar
Context (notifications callback)
Zip

对于原型设计,使用带有 -m参数的 curl 可以传递毫秒,并且在两种情况下都可以工作,要么是连接没有启动,错误404,500,错误 URL,要么是整个数据没有在允许的时间范围内全部检索,超时总是有效的。菲利普不会出去玩的.

只是不要在 shell 调用中传递 未经消毒用户数据。

system("curl -m 50 -X GET 'https://api.kraken.com/0/public/OHLC?pair=LTCUSDT&interval=60' -H  'accept: application/json' > data.json");
// This data had been refreshed in less than 50ms
var_dump(json_decode(file_get_contents("data.json"),true));