PHP file_get_contents 忽略超时?

Posted

技术标签:

【中文标题】PHP file_get_contents 忽略超时?【英文标题】:PHP file_get_contents ignoring timeout? 【发布时间】:2011-04-11 00:03:20 【问题描述】:
$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 行根本没有帮助。

【问题讨论】:

您能否尝试关闭“ignore_errors”标志以及静默@file_get_contents() 调用,看看是否有任何明显的错误弹出? @Mahdi.M:我无法关闭ingnore_errors,因为我需要区分 404 错误和连接问题产生的错误。让我重新表述一下。如果 ingnore_errors 关闭并且服务器返回 404 $content 将是错误的,我需要知道 $content 是否为 false 因为 404 错误或连接错误。当我抑制 @ 运算符时显示的错误是一个通用的,例如 file_get_contents(filename): failed to open stream 根据经验,您永远不需要使用@。如果它对您的应用程序至关重要,那么您可能以错误的方式编写它。不总是,但该死的经常! @Cesar:如果需要区分HTTP错误码,请在调用file_get_contents()后阅读$http_response_header。它被填充为服务器返回的 HTTP 标头数组。除了服务器连接问题(服务器未找到、超时、连接被拒绝等)之外,您可以获得所有错误 【参考方案1】:

您正在使用socket_create_context 设置读取 超时。如果您尝试访问的 页面 不存在,那么服务器将允许您连接并给您一个 404。但是,如果 站点 不存在(赢得't resolve or no web server behind it), 然后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

【讨论】:

以上是关于PHP file_get_contents 忽略超时?的主要内容,如果未能解决你的问题,请参考以下文章

php模拟浏览器获取get后返回的所有网址

PHP将'file_get_contents'分解为数组

PHP 将变量发送到 file_get_contents()

php中的file_get_contents或curl?

file_get_contents 通过 php 失败,通过浏览器工作

php PHP Image出力(file_get_contents)