PHP中将整数天数转时间戳实现初始邮件X天后发提醒的方案咨询
原有逻辑问题诊断
你的核心思路方向是对的,但代码存在4个关键错误导致无法运行:
setWasNotified()是存储初始邮件发送时间的写操作方法,没有定义返回值,无法通过它获取已存储的时间戳,需要先补充对应的读方法getAmountDayReminder()返回的单位是天,而Unix时间戳的单位是秒,二者直接相加数值不匹配- 用全等
===匹配当前时间的逻辑完全不可行:定时任务不可能刚好精准到秒触发到该判断,应该判断当前时间大于等于提醒阈值 - 外层判断逻辑错误:原有判断
!$entry->wasNotified() && !$entry->wasReminded()只有在初始邮件未发送时才会进入,初始邮件发送完成后就再也进不了逻辑,自然无法触发后续提醒
实现方案
第一步:补充读取初始邮件发送时间的方法
先在对应类里加读取存储的时间戳的方法:
public function getWasNotifiedTime(): ?int { $time = get_post_meta($this->getId(), self::META_WAS_NOTIFIED, true); return is_numeric($time) ? (int)$time : null; }
同时确保你的remind()方法内部会标记已发送提醒(比如存储对应的元字段,让wasReminded()能正确返回true),避免重复发送提醒邮件。
第二步:调整业务判断逻辑
// 场景1:未发送初始邮件,先发送初始邮件并记录时间 if (!$entry->wasNotified()) { // 此处补充发送初始邮件的业务逻辑 $entry->setWasNotified(); return; } // 场景2:已发初始邮件、未发提醒,判断是否到提醒时间 if (!$entry->wasReminded()) { $notifyTime = $entry->getWasNotifiedTime(); $intervalDay = $this->getAmountDayReminder(); // 天数转秒,计算最早可发送提醒的阈值时间 $remindThreshold = $notifyTime + $intervalDay * 86400; if (time() >= $remindThreshold) { // 此处补充发送提醒邮件的业务逻辑 $entry->remind(); } }
注意事项
- 上述逻辑需要挂载到定时任务中定期执行,例如WordPress环境可以用WP Cron,独立服务可以用系统crontab,执行频率设置为每天1次即可满足需求
- 如果业务允许管理员中途修改间隔天数,可根据需求补充逻辑:间隔修改后重新计算提醒阈值,已经超过阈值的未提醒记录直接触发提醒
内容的提问来源于stack exchange,提问作者romido
相关产品推荐
相关产品推荐

