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'];
}
定时器是否执行你要记录日志或者输出点数据到重点看下,而不是靠你业务逻辑来判定。直接在定时器里第一行打日志或者echo 点东西看下执行到没。
还有,定时器里不能用
$_SESSION
,定时器里用$_SESSION
业务逻辑必然出现bug,定时器里用Gateway的session接口