tp6 swoole 定时任务运行一段时间挂了

 来自CRMEB的案例代码:

/**
     * 开启定时器
     */
    protected function timer(App $app)
    {
        $last = time();
        $task = [6 => $last, 10 => $last, 30 => $last, 60 => $last, 180 => $last, 300 => $last];
        $this->timer = Timer::tick($this->interval, function () use (&$task, $app) {
            try {
                $now = time();
                event('Task_2');
                foreach ($task as $sec => $time) {
                    if ($now - $time >= $sec) {
                        $task[$sec] = $now;
                        event('Task_' . $sec);
                    }
                }
            } catch (\Throwable $e) {
                $app->log->error($e->getMessage());
            }
        });
    }

已在www/addons/app/event.php里面添加订阅事件:

'subscribe' => [
        app\subscribes\TaskSubscribe::class
    ],

定时任务运行一段时间挂了,报错:

The app object has not been initialized
/www/wwwroot/zsff.com/addons/vendor/topthink/think-swoole/src/Sandbox.php 135

#0 /www/wwwroot/zsff.com/addons/vendor/topthink/think-swoole/src/Sandbox.php(69): think\\swoole\\Sandbox->getApplication()
#1 /www/wwwroot/zsff.com/addons/vendor/topthink/framework/src/think/Container.php(72): think\\swoole\\Sandbox->think\\swoole\\{closure}()
#2 /www/wwwroot/zsff.com/addons/vendor/topthink/framework/src/think/Facade.php(47): think\\Container::getInstance()
#3 /www/wwwroot/zsff.com/addons/vendor/topthink/framework/src/think/Facade.php(96): think\\Facade::createFacade()
#4 /www/wwwroot/zsff.com/addons/vendor/topthink/framework/src/helper.php(228): think\\Facade::__callStatic(\'trigger\', Array)
#5 /www/wwwroot/zsff.com/addons/app/webscoket/SwooleWorkerStart.php(97): event(\'Task_2\')
#6 {main}

原来不是定时器挂了,定时器还在运行,订阅的事件居然不见了,所以导致调用不到。

日志文件里面还有:WARNING    Worker_reactor_try_to_exit() (ERRNO 9101): worker exit timeout, forced termination

以下配置没见有效果:

'max_request' => 100000, // 控制每个Worker进程的最大请求次数 https://wiki.swoole.com/#/server/setting?id=max_request

找了不少资料也没能解决,最后!!!

我在catch里面又重新订阅一次事件:

 Event::subscribe('app\subscribes\TaskSubscribe');

一开始运行还算稳定,当websocket里用户多了之后,还是出现问题

似乎在config/swoole.php文件里面配置订阅事件效果好一些

最后只能把订阅事件直接写到开启计时器的页面了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值