活动结束时间到了,商品页仍显示促销价。先不要手工改商品price;目录规则按网站时区计算日期,再由cron刷新规则价,应用服务器、数据库和Magento时区不一致时会出现半天偏差。

先把现象钉死

先用一个真实失败样本复现,不要一上来全量重建。把请求、实体ID和时间记下来,后面的SQL与日志才能对得上。

现场检查

  • 比较date、PHP、MySQL和Stores Configuration中的时区。
  • 检查catalogrule_apply_all最近一次success时间。
date; php -r 'echo date("c"),PHP_EOL;'
mysql -e "SELECT NOW(),UTC_TIMESTAMP();"
bin/magento config:show general/locale/timezone
mysql -e "SELECT job_code,status,scheduled_at,executed_at,finished_at FROM cron_schedule WHERE job_code LIKE 'catalogrule%' ORDER BY schedule_id DESC LIMIT 20;"

为了避免把环境差异当成根因,我会先在预发布或数据库副本复现;涉及订单、库存和支付的操作,正式环境只做只读核对,修复脚本必须带明确的订单号或SKU范围。

实际修复

统一服务器使用UTC,Magento配置业务时区,避免PHP单独写死另一时区。修复cron后运行bin/magento catalog:rule:apply(版本支持时)或保存规则并执行相关索引;清理full_page缓存。跨午夜活动最好明确写From/To日期并用测试SKU提前验证。

实施时的顺序

  • 先做数据与配置备份,记录当前值。
  • 只改一个变量并重跑失败样本。
  • 确认新数据正确后,再处理历史受影响记录。
  • 最后恢复定时任务或缓存。

怎么确认没有假好

  • 规则索引表中已无过期日期记录
  • 前台价格、购物车价格一致
  • 下一次午夜cron按时完成
  • 多网站时区边界符合业务预期

验收不只看后台提示“成功”。我还会从前台/API再走一次真实链路,并在下一轮cron、索引或缓存命中后重复检查,确认不是短暂正常。

留一个坑位提醒

直接删catalogrule_product_price会暂时消失,但下一次错误的规则应用还会写回来。