PHP file_get_contents忽略超时?

时间:2010-09-11 01:06:11

标签: php file-get-contents connection-timeout

$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行根本没有帮助。

1 个答案:

答案 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()

进行读取时检测读取超时时获得更多控制权

http://php.net/stream_get_meta_data