file_get_contents()
我正在使用循环中的方法调用一系列链接。每个链接的处理时间可能超过 15 分钟。现在,我担心 PHP 是否file_get_contents()
有超时时间?
如果是,它将超时并移至下一个链接。我不想在没有完成前一个链接的情况下调用下一个链接。
所以,请告诉我是否file_get_contents()
有超时时间。包含 的文件file_get_contents()
设置set_time_limit()
为零(无限制)。
file_get_contents()
我正在使用循环中的方法调用一系列链接。每个链接的处理时间可能超过 15 分钟。现在,我担心 PHP 是否file_get_contents()
有超时时间?
如果是,它将超时并移至下一个链接。我不想在没有完成前一个链接的情况下调用下一个链接。
所以,请告诉我是否file_get_contents()
有超时时间。包含 的文件file_get_contents()
设置set_time_limit()
为零(无限制)。
默认超时由default_socket_timeout
ini-setting定义,即 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 的最佳答案让我失望了。
作为 using 的替代方法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的评论部分
method
header
user_agent
content
request_fulluri
follow_location
max_redirects
protocol_version
timeout
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));