file_get_contents() 是否有超时设置



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

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

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

默认超时由 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);

> 正如@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;

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

此处超时为 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

值得注意的是,如果即时更改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

对于原型设计,使用 shell 中的 curl 和 -m 参数允许通过毫秒,并且在两种情况下都有效,要么连接未启动,错误 404、500、错误的 url,要么在允许的时间范围内未完全检索整个数据,超时始终有效。Php永远不会出去玩

只是不要在 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));

相关内容

  • 没有找到相关文章

最新更新