我有以下的PHP代码片段
if($fp = fopen($url, 'r')) {
stream_set_timeout($fp, 1);
stream_set_blocking($fp, 0);
}
$info = stream_get_meta_data($fp);
我希望请求在1秒后超时。如果我将sleep(20)
放在我正在阅读的$url
中,它只会等待整整20秒而且永远不会超时。是否有更好的方法可以使用fopen
进行超时?
如果我在该代码之上使用ini_set('default_socket_timeout',2)
它会超时,但$info
则会变为空,所以理想情况下我想使用流函数。
答案 0 :(得分:10)
您可以使用stream_context_create()和http context option timeout
。但是,如果发生超时,fopen()
仍会返回false,stream_get_meta_data()
将无效。
$url = 'http://...';
$context = stream_context_create( array(
'http'=>array(
'timeout' => 2.0
)
));
$fp = fopen($url, 'r', false, $context);
if ( !$fp ) {
echo '!fopen';
}
else {
$info = stream_get_meta_data($fp);
var_dump($info);
}