我有一个名为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的内容:
编辑:顺便说一句,当我从本地服务器调用此页面(testResponse.php)时,它似乎正常工作。好吧,它将超时乘以2.例如,如果我有1超时,我会回复类似“2.0054645”的内容。但只能从当地......
答案 0 :(得分:4)
解决方案是使用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会话的执行时间。因此,当连接超时时,$errno
将等于28
,cURL操作超时错误的代码。其余的错误代码为listed in the cURL documentation,因此您可以展开上面的脚本以采取相应的措施。
最后,由于设置了CURLOPT_RETURNTRANSFER
选项,如果会话成功,curl_exec($ch)
将被设置为检索到的页面的内容。否则,它将等于false
。
希望这有帮助!
修改:删除了语句设置CURLOPT_HEADER
。出于某种原因,我还认为curl_exec($ch)
将$ch
的值设置为返回的内容,忘记了curl_exec()
返回的内容。