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

swoole_server->addtimer

此方法已移除,请勿使用

设置定时器。1.6.12版本前此函数不能用在消息队列模式下,1.6.12后消息队列IPC模式也可以使用定时器。

bool swoole_server->addtimer(int $interval);
bool swoole_server_addtimer(swoole_server $serv, int $interval);

第二个参数是定时器的间隔时间,单位为毫秒。swoole定时器的最小颗粒是1毫秒。支持多个定时器。此函数可以用于worker进程中。

  • swoole1.6.5之前支持的单位是秒,所以1.6.5之前传入的参数为1,那在1.6.5后需要传入1000
  • swoole1.6.5之后,addtimer必须在onStart/onWorkerStart/onConnect/onReceive/onClose等回调函数中才可以使用,否则会抛出错误。并且定时器无效
  • 注意不能存在2个相同间隔时间的定时器
  • 即使在代码中多次添加一个定时器,也只会有1个生效

1.7.5之后onStart回调中不再支持定时器
建议使用tick定时器,addtimer定时器未来或将移除

增加定时器后需要为Server设置onTimer回调函数,否则Server将无法启动。多个定时器都会回调此函数。在这个函数内需要自行switch,根据interval的值来判断是来自于哪个定时器。

面向对象风格:

$serv->addtimer(1000); //1s
$serv->addtimer(20); //20ms
$serv->on('Timer', 'my_OnTimer');

function my_OnTimer($serv, $interval)
{
    echo "Timer[$interval] is call\n";
}

  • 黄万超

    这个 addtimer 应该在什么时间加入?我的代码一直提示:swoole_server: can not use addtimer here

  • Rango-韩天峰

    在swoole_server->start之后

  • 赫宝匣

    version 1.7 在onStart addTimer报了这么一条消息,就退出了 Server: start.Swoole version is [1.7.0] [1] 33687 alarm php server.php -e development

  • zhouleyu

    version 1.7 在onStart addTimer报了这么一条消息

  • Rango-韩天峰

    此BUG已经修复了。低版本Linux或MacOS确实有此问题,请升级到1.7.1

  • Karl

    'daemonize' => false ...

    $serv->start(); $serv->on("Timer",function($serv,$interval){ print("xxx"); }); $serv->addtimer(100);

    CLI模式下 start调用是否会阻塞,后面的程序无法执行到

  • Karl

    貌似正确的用法是这样的 $serv->on("Timer", function($serv,$interval){ echo "RRRR\r\n"; });

    $serv->handler('onStart', 'onServerStart');

    function onServerStart($serv){ echo "Server:start\n"; $serv->addtimer(1000); } $serv->start();

  • 安达英司

    求问一下,1.7.5之后onStart不再支持定时器,那么定时器只能在worker进程中被addtimer()?那多个worker启动时岂不是会被重复add多次?(看着貌似有点没意义啊)

    另外timer是由哪个进程执行的?master、manager还是某个worker?(感觉似乎应该是由master定时触发后随机通知到某个worker执行吧?)

  • IT柏拉图

    怎么样在timer里使用一个全局变量,感觉逻辑很乱呀

  • 蓝颜

    <?php $serv = new swoole_server('127.0.0.1', 9501); $serv->on('WorkerStart', function($serv) { $serv->addtimer(1000); }); function my_OnTimer($serv, $interval) { echo "Timer[$interval] is call\n"; } $serv->on('Timer', my_OnTimer); $serv->on('Receive', function() {}); $serv->start();

    上述代码计时器可以正常运作了,但PHP报Notice错误:Notice: Use of undefined constant my_OnTimer - assumed 'my_OnTimer',却不知为何?

  • yxf

    也就你的代码能跑,但出现这个错误,谁能解决一下 [2014-09-25 17:56:29] WARN swReactorEpoll_wait: [Reactor#0] epoll [EPOLLIN] handle failed. fd=3. Error: Inappropriate ioctl for device[25]

  • 蓝颜

    $serv->on('Timer', my_OnTimer); 应改为$serv->on('Timer', 'my_OnTimer');

  • 不懂代码的橙畜猿

    $serv->on('Timer', 'my_OnTimer');

  • Rango-韩天峰

    已修正。

  • php学习之路

    $server->on('WorkerStart', function($serv) { $serv->addtimer(60000); });

    $server->on('Timer', 'my_OnTimer'); function my_OnTimer($serv, $interval) { global $gotime; $gotime+=1; echo "Timer[$interval] is call 本服务器端已运行 $gotime 分钟\n"; } 结果是有几个worker进程就会运行几次my_OnTimer函数,怎么会这样? 日志输出的结果是(两个worker进程的结果): Timer[60000] is call 本服务器端已运行 4 分钟 Timer[60000] is call 本服务器端已运行 4 分钟 Timer[60000] is call 本服务器端已运行 5 分钟 Timer[60000] is call 本服务器端已运行 5 分钟 Timer[60000] is call 本服务器端已运行 6 分钟 Timer[60000] is call 本服务器端已运行 6 分钟

  • 丰灵

    定时器中怎么传递参数啊?全局变量也不行啊

  • 小eye

    swoole_timer_del()或$serv->deltimer()是不是不能用在task worker中 ?????

  • hpking

    websockect 中能用addtimer吗?