【问题标题】:time limit function execution in PHP or anything else在 PHP 或其他任何东西中执行时间限制函数
【发布时间】:2011-11-26 05:23:24
【问题描述】:

我可以说我的问题与 PHP 有关,但我更关心的是在函数执行可以无限期进行的情况下编程的正确逻辑。

监控执行某些功能所需时间的正确方法是什么?如何停止此执行并继续执行程序的其余部分?

好的,我知道例如有一个 set_time_limit() 函数会返回致命错误,但我不希望这样,我希望我的代码在 x 秒后继续,或者可能在超过时间后抛出异常,catch它并做其他事情?

正在编写某种“看门狗”功能解决方案,这是如何完成的?

感谢您提供的任何帮助、任何链接、任何以“应该”解决此问题的方式解决此问题的文章。

BR, 纽曼

【问题讨论】:

  • 上下文是什么,更具体地说?我猜该函数包含某种循环。如果这是正确的,我的第一反应是在进入循环之前获取带有microtime() 的时间戳,然后将该时间戳与每次迭代时在循环内生成的时间戳进行比较。达到某个值后,您可以抛出异常或执行其他任何操作。不过,也许我误解了您正在尝试做的事情的背景。您是否正在寻找可以更轻松地应用于众多功能的东西?
  • 是的,类似的。我的问题是我的一个功能是尝试远程登录到其他设备,有时远程登录超时太长了。

标签: php exception time limit


【解决方案1】:

PHP 没有提供使函数超时的通用方法。但是很多常见此问题的组件允许您定义超时。

例子:

  • HTTP Stream Wrapper 允许您指定 timeout 选项:

    file_get_contents('http://example.com', false, stream_context_create(
        array('http' => array('timeout' => 10 /* seconds */))
    ));
    
  • PDO(数据库抽象层)允许您使用PDO::ATTR_TIMEOUT attribute 设置超时(请注意,此属性对于不同的数据库驱动程序可能意味着不同的东西):

    $pdo->setAttribute(PDO::ATTR_TIMEOUT, 10 /* seconds */);
    
  • 使用FTP时可以设置连接超时:

    $ftp = ftp_connect('example.com', 21, 10 /* seconds */)
    

类似地,所有其他访问潜在远程资源的扩展都将提供此类超时参数或选项。

【讨论】:

    【解决方案2】:

    特别是在 PHP 中,我认为您没有有效的方法来从外部控制函数的执行时间。 正如您所说,set_time_limit 之类的内容会引发 Fatar 错误并终止您的脚本。

    我建议在你的函数中弄乱你的执行时间,使用microtime() 之类的东西,如果超过时间限制则抛出异常;您将能够在外部捕获并继续采取相应措施的异常。

    【讨论】:

    • 好的,我会这样尝试。但是一般如何解决这个问题(不是 PHP)?
    • 我认为这取决于您使用的语言。像 Earlang 这样的一些允许程序员将进程附加在一起,从而允许它们相互监视。我不知道是否有处理这种情况的标准技术,但如果有,请发表评论让我知道名称:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    相关资源
    最近更新 更多