PHP与MySQL时区设置问题影响审计日志 求解决方案
解决方案
1. 统一PHP与数据库时区,修复循环终止问题
核心问题是时区不匹配导致赛事查询逻辑出错,进而让Cron任务提前终止。需确保PHP和MySQL时区完全对齐:
修改cron.php的时区配置
// 先设置PHP时区为赫尔辛基 date_default_timezone_set('Europe/Helsinki'); // 数据库连接完成后,设置MySQL时区为赫尔辛基(优先用时区标识符,适配夏令时) $C->query("SET time_zone = 'Europe/Helsinki'");
若MySQL未加载时区表无法识别
Europe/Helsinki,可改用固定偏移'+03:00',但需注意夏令时切换时需手动调整偏移。
校验赛事查询SQL逻辑
确保获取待处理赛事的SQL基于数据库当前时区做时间判断,示例:
SELECT id FROM matches WHERE lock_time <= NOW() AND is_processed = 0;
当数据库时区与lock_time存储的时区一致时,NOW()能正确匹配所有已锁定的赛事,避免仅返回首个ID。
2. 修正审计日志时间戳时区
审计日志时间为UTC的问题,根源是插入时未使用正确时区的时间源:
方案A:PHP生成时区正确的时间戳
若审计日志时间由PHP生成,直接用已设置的时区生成时间后插入:
// 生成赫尔辛基时区的当前时间 $log_time = date('Y-m-d H:i:s'); // 插入审计日志示例 $C->query("INSERT INTO audit_log (action_type, created_at) VALUES ('补设比分记录', '$log_time')");
方案B:数据库自动生成正确时间
若审计日志时间用MySQL的NOW()函数生成,只要数据库时区已设为Europe/Helsinki,NOW()会直接返回UTC+3的时间,无需修改插入逻辑:
INSERT INTO audit_log (action_type, created_at) VALUES ('更新NULL冠亚军记录', NOW());
3. 验证Cron任务运行
修改后手动执行cron.php测试:
- 确认所有符合条件的赛事都被处理(而非仅首个ID)
- 检查四类审计条目(补设比分、更新NULL比分、更新NULL冠亚军、补设冠亚军)的时间戳均为赫尔辛基时区(UTC+3)
- 验证赛事锁定、冠亚军预测的自动补全逻辑正常
额外排查点
若修改后仍出现循环终止,检查:
- 赛事表
lock_time字段是否存储了正确时区的时间(若存的是UTC时间,需转换为赫尔辛基时区后再做比较) - Cron循环逻辑中是否存在错误触发的
break/return语句,导致提前退出循环
内容的提问来源于stack exchange,提问作者Kasperi Koski
相关产品推荐
相关产品推荐

