swoole_timer_after

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

int swoole_timer_after(int $after_time_ms, mixed $callback_function);

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

执行成功返回定时器ID,若取消定时器,可调用 swoole_timer_clear

  • $after_time_ms 指定时间,单位为毫秒,最大不得超过 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会造成孤儿进程

  • 过期的奶酪

    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"); } 要如何传参数吖?

  • qq564916624

    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,把参数写在回调上会报错