php - 文件获取内容或 fsockopen - 超时问题

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

我有一个名为 testResponse.php 的 php 文件,它只是:

<?php
 sleep(5);
 echo"go";
?>

现在,我使用 file_get_contents 从另一个页面调用此文件,如下所示:

$start= microtime(true);
$opts = array('http' =>
    array(
        'method'  => 'GET',
        'timeout' => 1
    )
);

$context  = stream_context_create($opts);

$loc = @file_get_contents("http://www.mywebsite.com/testResponse.php", false, $context);
$end= microtime(true);
echo $end - $start, "\n";

输出超过5秒,这意味着我的超时被忽略了...... 我遵循了这篇文章的建议:stackoverflow.com/questions/3689371

但主机名似乎不能是路径(如 www.mywebsite.com/testResponse.php),而应直接是主机名,如 www.mywebsite.com。

所以我坚持实现这个目标:

获取带有约束的页面 www.test.com/x.php 的内容:

  • 如果 test.com 不存在或页面 x.php 不存在,则快速返回任何内容
  • 如果页面存在但加载时间超过 1 秒,则中止
  • 否则获取文件的内容

编辑:顺便说一句,当我从本地服务器调用此页面(testResponse.php)时,它似乎可以工作。嗯,它将超时乘以 2。例如,如果超时为 1,我将回显类似“2.0054645”的内容。但仅限于本地...

最佳答案

解决办法是使用PHP的cURL functions.您链接到的另一个问题正确地解释了有关读取超时连接超时等问题,但这些都不是您真正想要的这里。即使连接超时也不起作用,因为与testResponse.php的连接总是成功的;之后就会等待,所以您需要的是执行超时。这就是 cURL 派上用场的地方。

因此,testResponse.php 不需要更改。不过,在您的主文件中,尝试以下代码(这已经过测试并且可以在我的服务器上运行):

$start = microtime(true);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.mywebsite.com/testResponse.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
$output = curl_exec($ch);
$errno = curl_errno($ch);
if ($errno > 0) {
    if ($errno === 28) {
        echo "Connection timed out.";
    }
    else {
        echo "Error #" . $errno . ": " . curl_error($ch);
    }
}
else {
    echo $output;
}
$end = microtime(true);
echo "<br><br>" . ($end - $start);
curl_close($ch);

这通过第 5 行中看到的 CURLOPT_TIMEOUT 选项设置 cURL session 的执行时间。因此,当连接超时时,$ errno 将等于 28,即 cURL 操作超时错误的代码。其余错误代码为 listed in the cURL documentation ,因此您可以扩展上面的脚本以进行相应的操作。

最后,由于设置了 CURLOPT_RETURNTRANSFER 选项,如果 session 成功,curl_exec($ch) 将设置为检索页面的内容。否则,它将等于 false

希望这有帮助!

编辑:删除了语句设置CURLOPT_HEADER。由于某种原因,我还认为 curl_exec($ch)$ch 的值设置为返回的内容,忘记了内容是由 curl_exec().

关于php - 文件获取内容或 fsockopen - 超时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18739458/

相关文章:

php - Nginx 和 PHP-cgi - 无法 file_get_contents 服务器上的任何网站

php - file_get_contents https 超时 1 分钟?

php - fsockopen 错误我想跳过

PHP 正则表达式获取 BBCode 标签之间的文本

php - 如何将 include(php 文件) 放入变量?

php - 关于Yii2 RBAC的疑惑

php - SQL INNER Join 没有给出结果

php - HTTP/1.1 400 file_get_contents 中的错误请求

php - 实时音频流套接字卡在浏览器中

php - 未启用 PHP 中的套接字传输 "ssl"