如何实现每日自动查询MySQL变更并通过PHP发送邮件?
嘿,我来帮你理清楚这个需求的解决思路——你已经掌握了数据库查询和邮件发送的核心逻辑,现在卡壳的就是无交互自动化触发的部分对吧?咱们一步步说:
绝对不推荐:用无限循环实现
无限循环确实能让脚本一直运行并定期检查,但这是个非常糟糕的方案:
- 它会一直占用一个PHP进程,如果服务器的PHP进程数有限,很可能会阻塞其他脚本的运行;
- 一旦脚本因为内存溢出、服务器重启或者意外崩溃,整个监控就停了,可靠性极低;
- 后期维护也麻烦,你得时刻盯着这个进程有没有挂掉。
正确的姿势:用系统定时任务(Cron)
这是服务器端自动化脚本的标准解决方案,完全不需要浏览器或用户触发,到点自动执行,稳定又省心。
具体步骤
- 先写好你的业务脚本:比如命名为
monitor_db_changes.php,里面包含:- 查询数据库的新增/变更数据(建议记录上次执行的时间戳,只查这个时间点之后的数据,避免重复处理);
- 如果有符合条件的数据,执行邮件发送逻辑;
- 更新上次执行的时间戳(存在数据库或者本地配置文件里都可以)。
- 配置定时任务:
- Linux系统用
cron,比如你想每15分钟检查一次,就编辑Cron任务:
然后添加一行:crontab -e
解释下:*/15 * * * * php /var/www/html/monitor_db_changes.php*/15表示每15分钟执行一次,后面的四个*分别对应小时、日期、月份、星期,按需调整就行。 - Windows系统用「任务计划程序」,创建一个定时任务,指定PHP.exe的路径和你的脚本路径,设置执行频率即可。
- Linux系统用
语言选择:PHP完全够用,没必要换
你已经熟悉PHP的数据库操作和邮件发送,完全没必要为了这个需求切换到其他语言。PHP处理这类轻量的定时任务非常顺手,学习成本为0。如果后续有更复杂的需求(比如高并发、大数据处理),再考虑Python/Go这些也不迟。
额外小提示:避免重复发送邮件
一定要记录上次脚本执行的时间戳,比如在数据库里建个task_log表,或者用一个本地的last_run.txt文件存时间戳。每次脚本运行时,只查询这个时间戳之后新增或修改的数据,这样就不会重复发送相同的邮件啦。举个简单的PHP示例:
// 读取上次执行时间(这里用文件示例,你也可以存在数据库) $last_run_file = 'last_run.txt'; $last_run_time = file_exists($last_run_file) ? intval(file_get_contents($last_run_file)) : 0; // 查询最近更新的数据 $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'pass'); $stmt = $pdo->prepare("SELECT * FROM your_table WHERE updated_at > ?"); $stmt->execute([date('Y-m-d H:i:s', $last_run_time)]); $changes = $stmt->fetchAll(PDO::FETCH_ASSOC); // 有变更就发邮件 if (!empty($changes)) { // 这里写你的邮件发送逻辑 send_email($changes); } // 更新上次执行时间为当前时间 file_put_contents($last_run_file, time());
内容的提问来源于stack exchange,提问作者Ingimar Eyfjord Smarason
相关产品推荐
相关产品推荐

