You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 06:35:07