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

PHP中将整数天数转时间戳实现初始邮件X天后发提醒的方案咨询

原有逻辑问题诊断

你的核心思路方向是对的,但代码存在4个关键错误导致无法运行:

  1. setWasNotified() 是存储初始邮件发送时间的写操作方法,没有定义返回值,无法通过它获取已存储的时间戳,需要先补充对应的读方法
  2. getAmountDayReminder() 返回的单位是天,而Unix时间戳的单位是秒,二者直接相加数值不匹配
  3. 用全等===匹配当前时间的逻辑完全不可行:定时任务不可能刚好精准到秒触发到该判断,应该判断当前时间大于等于提醒阈值
  4. 外层判断逻辑错误:原有判断!$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:21:01