15
$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,不应该是五秒左右???

取消注释 ini_set 行根本没有帮助。

4

1 回答 1

15

您正在使用 设置读取超时socket_create_context。如果您尝试访问的页面不存在,那么服务器将让您连接并给您一个 404。但是,如果该站点不存在(不会解析或后面没有 Web 服务器),那么file_get_contents()将忽略读取超时,因为它甚至还没有超时连接到它。

我认为您不能在file_get_contents. 我最近重写了一些要使用的代码,fsockopen()因为它可以让你指定连接超时

$connTimeout = 30 ;
$fp = fsockopen($hostname, $port, $errno, $errstr, $connTimeout);

当然,进入 fsockopen 需要你fread()在一个循环中从它开始,稍微复杂化你的代码。但是,它确实为您提供了更多控制权,可以在使用读取时检测读取超时stream_get_meta_data()

http://php.net/stream_get_meta_data

于 2010-09-11T08:25:32.210 回答