$url = 'http://a.url/i-know-is-down';
//ini_set('default_socket_timeout', 5);
$ctx = stream_context_create(array(
'http' => array(
'timeout' => 5,
'ignore_errors' => true
)
)
);
$start = microtime(true);
$content = @file_get_contents($url, false, $ctx);
$end = microtime(true);
echo $end - $start, "\n";
我得到的反应一般是21.232 segs,不应该是大约5秒???
取消注释ini_set行根本没有帮助。
答案 0 :(得分:14)
您正在使用socket_create_context
设置读取超时。如果您尝试访问的页不存在,那么服务器将允许您连接并为您提供404.但是,如果站点不存在(赢了)不解决它后面的Web服务器,或者file_get_contents()
将忽略读取超时,因为它还没有超时连接它。
我认为您无法在file_get_contents
中设置连接超时。我最近重写了一些代码以完全使用fsockopen()
,因为它允许您指定connect timeout
$connTimeout = 30 ;
$fp = fsockopen($hostname, $port, $errno, $errstr, $connTimeout);
进入fsockopen会导致你需要在循环中fread()
,然后稍微编写代码。但是,它确实可以让您在使用stream_get_meta_data()