【已解决】使用 gateway-worker 的 onWebSocketConnect 里面的定时器不执行

xiaoming

解决

1 定时是有执行的
2 是逻辑代码问题,定时器不能直接获取$_SESSION
3 感谢 @six

问题描述

1 执行php7.4 start.php status 命令, 状态都是idle 且 单个进程的定时器看了 基本不超过3个
2 Event.php 代码中,没删除定时器的代码
3 正式和测试的都是采取静态单文件的php.4,环境应该是一样
4 测试环境正常,正式不正常
5 正式和测试的代码采取restart -d 执行,且版本号一样
6 我该如何排查比较合适

程序代码或配置

public static function onWebSocketConnect($client_id, $data)
{
        $_SESSION['request_data'] = $data;
        self::isDebug($data['get']['debug']??"");
        $timer_id = Timer::add(5,function () use($client_id,&$timer_id){

            // 测试环境有执行,正式没有,没想到什么原因会这样,很神奇
            if(self::isDebug()){
                Gateway::sendToClient($client_id, WsData::dataPackJson(
                    WsData::A_OK,[],"调试模式 定时任务ID执行:{$timer_id}"));
            }
            self::auth();
            if(empty($_SESSION['auth_id'])){
                Gateway::closeClient($client_id, WsData::dataPackJson(
                    WsData::A_AUTH_MISS,[],"请先认证_v1"));
            }
        },[],false);
        if(self::isDebug()){

            //有发送
            Gateway::sendToClient($client_id, WsData::dataPackJson(
                WsData::A_OK,[],"调试模式 定时任务ID开始:{$timer_id}"));
        }
}

 public static function isDebug($data = null): bool
    {
        if (func_num_args() <= 0) {
            return !empty($_SESSION['request_debug']);
        }
        $_SESSION['request_debug'] = $data == "jQfSfuGdzMVdDa";
        return $_SESSION['request_debug'];
    }
489 1 0
1个回答

six

定时器是否执行你要记录日志或者输出点数据到重点看下,而不是靠你业务逻辑来判定。直接在定时器里第一行打日志或者echo 点东西看下执行到没。

还有,定时器里不能用$_SESSION,定时器里用$_SESSION业务逻辑必然出现bug,定时器里用Gateway的session接口

  • 暂无评论
×
🔝