PHP为try catch设置了时间限制

时间:2014-02-04 18:46:07

标签: php try-catch

我使用的是无法编辑的类,因为它已加密。 api从一个并不总是可用的网站反弹,导致加载时间延迟。如果超过10秒,页面将开始显示类中的错误。

有没有办法可以在try catch上加上时间限制来防止错误并限制课程的时间?

try {
    $r = $v->url($u);
} catch (Exception $e) {
    $r='';
}   

2 个答案:

答案 0 :(得分:0)

如果你愿意得到hacky并做一些奇怪的事情,一切都是为了这堂课,你可以这样做:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://www.mysite.com/callUrlFunction.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 
      http_build_query(array('url' => 'http://www.othersite.com')));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); //timeout in seconds
$r = curl_exec($ch);
$curl_errno = curl_errno($ch);
curl_close ($ch);
if ($curl_errno > 0) {
   $r = "";
} 

然后在callUrlFunction.php中你会有

<?php
try {
  $r = $v->url($_POST['url']);
} catch (Exception $e) {
  $r='';
}
echo $r; //or maybe json_encode($r) or serialize($r), depending on what $r is
?>

当然,这一切都很荒谬,因为你可以卷曲其他人而不是使用包装器。卷曲自己很奇怪/愚蠢。

答案 1 :(得分:0)

你可以刷新输出缓冲区(http://php.net/flush),这样用户就会在脚本仍在运行时开始获取内容,但这可能会很麻烦。

我可能会创建一个单独的脚本并使用shel_exec从我的脚本调用它,这样你可以使用一些外部工具来设置超时,或者你可以分叉一个单独的进程并检查自己的时间,当时间是超过10秒你可以杀死那个进程并显示错误(我可能会使用这个选项)。