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

如何实现endpoint持久运行触发邮件调度,无需依赖站点活跃访问

邮件调度服务不依赖站点访问的实现方案

原有方案弊端

你当前通过前端JS每秒轮询调用endpoint的方式有两个核心缺陷:一是完全依赖站点用户访问,无访客时任务会停摆;二是大量无效POST请求会额外占用服务器带宽和处理资源。

可行实现方案(优先级从高到低)


方案1:系统定时任务(Crontab,生产环境首选)

这是PHP生态下处理定时调度最成熟、稳定性最高的方案,无额外服务依赖:

  • 先将endpoint.php调整为CLI(命令行)可运行版本,移除所有Web请求相关的依赖逻辑,保留数据库连接、邮件发送、调度更新的原有逻辑即可。
  • Linux服务器直接添加Crontab规则,示例为每分钟执行一次脚本,执行日志可落地存储用于排查问题:
* * * * * /usr/bin/php /你的站点绝对路径/endpoint.php >> /var/log/mail_schedule.log 2>&1
  • 优势:服务器运行期间会自动触发任务,完全和站点访问解耦,资源消耗极低。你原有代码中已经包含了next_schedule到期判断逻辑,哪怕每分钟执行一次,也只会处理到期的调度任务,不会出现重复发件问题。

方案2:PHP常驻进程(适用于秒级调度精度需求)

如果你需要秒级的调度精度,可以自行实现CLI常驻脚本,用进程管理工具托管即可:

  • 新增常驻启动脚本start_schedule.php,示例逻辑如下:
<?php
// 取消PHP脚本超时限制
set_time_limit(0);
// 放开内存限制,避免长时间运行溢出
ini_set('memory_limit', '-1');

while (true) {
    // 引入你原有endpoint的处理逻辑,建议封装为函数直接调用避免重复加载
    require_once __DIR__ . '/endpoint.php';
    // 间隔1秒执行一次,和你原有JS轮询的频率一致
    sleep(1);
}
?>
  • 用Supervisor等进程管理工具托管该脚本,配置开机自动启动、崩溃自动拉起规则,保证服务可用性。
  • 注意点:需要在处理逻辑中增加异常捕获,避免单次任务报错导致整个进程退出,同时定期排查内存占用情况。

方案3:WebSocket挂载(不推荐)

WebSocket是面向双向通信场景的技术,你当前纯后端定时调度的场景完全不需要用到,属于技术选型冗余,会额外增加维护成本,不建议采用。

原有代码优化提示

你现有endpoint.php中的UPDATE SQL语法存在错误,用AND代替了字段之间的逗号,会导致调度更新失败,修正写法参考:

mysqli_query($config, sprintf("UPDATE mail_schedules SET next_schedule = '%d', schedule_message_id = '%d' WHERE mail_id = '%d'", 
$calculateNextMailDate, $nextMessageID, $schedule['mail_id'])) or die(mysqli_error());

另外建议增加数据库事务处理,避免邮件发送成功但调度更新失败,导致重复发件的问题。

内容的提问来源于stack exchange,提问作者Festus Akushie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:45:01