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


file get content or fsockopen - timeout issue

我有一个名为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 函数。您链接到的另一个问题正确地解释了一些事情,关于读取超时与连接超时等等,但这两个都不是您在这里真正寻找的。 即使连接超时也不起作用,因为与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 会话的执行时间。因此,当连接超时时,$errno将等于 28 ,cURL 的操作超时错误的代码。cURL 文档中列出了其余错误代码,因此您可以展开上面的脚本以采取相应的操作。

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

希望这有帮助!

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