× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

Timer::after

在指定的时间后执行函数。

int Swoole\Timer::after(int $after_time_ms, callable $callback_function, ...$params);

Swoole\Timer::after的函数风格别名是swoole_timer_after

Swoole\Timer::after函数是一个一次性定时器,执行完成后就会销毁。此函数与PHP标准库提供的sleep函数不同,after是非阻塞的。而sleep调用后会导致当前的进程进入阻塞,将无法处理新的请求。

执行成功返回定时器ID,若取消定时器,可调用 Swoole\Timer::clear

  • $after_time_ms 指定时间,单位为毫秒,4.2.10以下版本最大不得超过 86400000
  • $callback_function 时间到期后所执行的函数,必须是可以调用的。
  • 可以使用匿名函数的use语法传递参数到回调函数中

协程模式

在协程环境下Swoole\Timer::after回调中会自动创建一个协程,可以直接使用协程相关API,无需调用go创建协程。

可设置enable_coroutine关闭自动创建协程

使用示例

Swoole\Timer::after(1000, function() use ($str) {
    echo "timeout, $str\n";
});

  • 袁昕

    我用的版本是1.7.19 我的需求是有一个请求过来,如果没有达到条件,就延迟20秒再模拟执行一次,持续最多10次 但是遇到了错误,导致中间执行几次就断了 $call_back = function ($arg_array) { shell_exec('wget "' . $arg_array . ' " > /dev/null 2>&1 &'); }; swoole_timer_after ( 20000, $call_back, $_uri );

    执行次数不一定,总之,中间估计一报错,就接不上了,请问是什么情况?

    Warning: Invalid callback , no array or string given in /data/swoole.php on line 90 Stack trace: 1. {main}() /data/swoole.php:0 2. swoole_http_server->start() /data/swoole.php:90 Warning: swoole_http_server::start(): swoole_timer: onTimeout handler error in /data/swoole.php on line 90 Stack trace: 1. {main}() /data/swoole.php:0 2. swoole_http_server->start() /data/swoole.php:90

  • 星期八

    文档错误 “$callback_function 时间到期后所执行的函数,必须是可以调用的。callback函数不接受任何参数”

  • 臣孓

    为什么callback不接受任何参数呀????好不方便哦!!

  • lovyhui

    可以接收参数

  • 溯雪/moo

    echo "准备异步通知\n"; var_dump(swoole_timer_after( 10000, function ($tmpData) { echo "进入异步\n";

                },
                $params
            ));
    

    只能打印出 准备异步通知,不能打印出 进入异步 centos php7.0.9

  • 溯雪/moo

            echo "准备异步通知\n"; 
            var_dump(swoole_timer_after( 10000, 
            function ($tmpData) { 
                        echo "进入异步\n";
            },
            $params
        ));
    

    只能打印出 准备异步通知,不能打印出 进入异步 centos php7.0.9

    顺带,这个评论框好难用

  • Hi

    怎么使用啊 怎么按照例子来不行

  • 开心快乐每一天

    低概率使用tisk会造成孤儿进程

  • 15727370906

    swoole_timer_after(5000, function() use($ws, $frame){ $ws->push($frame->fd, "5s: I'm server.\n"); }); 闭包形式改成: swoole_timer_after(5000, [$this, 'timerAfter']); public function timerAfter() { $ws->push($frame->fd, "5s: I'm server.\n"); } 要如何传参数吖?

  • 18756390551

    swoole_timer_after(5000, [$this, 'timerAfter'],$a,$b);
     public function timerAfter() { 
            $params = func_get_args();
            $a=$params[0];
            $b=$params[1];
            $ws->push($frame->fd, "5s: I'm server.\n");
     }
    

    可以通过这样获取参数 不知道是不是bug,把参数写在回调上会报错

  • 13161637581

    为什么在task任务进程中创建定时器偶尔不会执行,已经成功返回了定时器id了

  • 15605188918

    我发生了重复执行,偶发 概率非常低 有点并发 大佬 咋解决呀

  • 18917071025

    怎么用after方法,返回的timerid 好多重复的?