【问题标题】:Limit the execution time of a callable in PHP限制 PHP 中可调用对象的执行时间
【发布时间】:2016-06-03 23:54:02
【问题描述】:

我需要一个函数,它会在可调用函数花费很长时间完成其任务后抛出可捕获的异常。

注意:我不是指 PHP 脚本的最大执行时间。

该函数应该像call_user_func 一样工作,只是它需要以秒为单位的时间限制。

    function task() {
        // does a lot of work...
    }

    try {
       call_user_func('task', 30); // limit to 30 seconds
    } catch (TimeoutException $ex) {
        // ....
    }

我无法将自定义逻辑添加到 task 函数以自行引发异常。这个想法是强制可调用的方法在 X 秒后中止或失败。

我有 CLI 脚本,我想调节它们完成任务所需的时间。

【问题讨论】:

  • This question 可能会给你一些提示。不过,实现自己的调度程序绝非易事,通常需要考虑很多边缘情况。

标签: php timeout callable


【解决方案1】:

您可以使用 EvTimer。但是,您必须安装 Ev 包,因为它不是 PHP 的一部分。您可以使用 pecl install ev

做到这一点
    <?php

        function task(){
            // DOES A LOT OF WORK...
        }

        function runTaskWithin($seconds) {
            // SET UP A TIMER TO FIRE AFTER X-SECONDS
            $evT = new EvTimer($seconds, 0, function ($seconds) {
                throw(new Exception("{$seconds} Seconds has elapsed since Execution began... Better rest, Now."));
            });
        }

        // ONCE 30 SECONDS PASSES A NEW EXCEPTION WILL BE THROWN...
        // NON-BLOCKING... 
        try {
            runTaskWithin(30); //  LIMIT TO 30 SECONDS
        } catch (Exception $ex) {
            // ....
        }

【讨论】:

  • 1) OP 提到他无法编辑任务方法 2) 根据 php 文档中的示例,看起来 EvTimer 是一个阻塞函数。这意味着您的示例总是会休眠 30 秒并抛出异常?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 2017-10-18
相关资源
最近更新 更多