在 PHP 网站中实现定时执行脚本,主要有以下几种方法,每种方法适用于不同的环境和技术栈:

方法 1:使用 Cron 作业(Linux/Unix 服务器,推荐)

适用场景:有服务器访问权限,能配置(最可靠的方式)。

cron

步骤

  1. 创建 PHP 脚本
    例如:
  2. /path/to/your/script.php
  3. php
  4. // 记录日志
  5. file_put_contents(7', date('Y-m-d H:i:s') . " 定时任务执行\n", FILE_APPEND);
  6. // 你的业务逻辑
  7. // 例如:发送邮件、清理缓存、更新数据库等
  8. 配置任务
    运行并添加一行:
  9. cron
  10. crontab -e
  11. bash
  12. # 每分钟执行一次
  13. * * * * * /usr/bin/php /path/to/your/script.php
  14. # 每天凌晨 3 点执行
  15. 0 3 * * * /usr/bin/php /path/to/your/script.php
  16. # 每 5 分钟执行一次
  17. */5 * * * * /usr/bin/php /path/to/your/script.php
    • 是 PHP 路径(可用查找)。
  • /usr/bin/php
  • which php
    • 确保脚本有可执行权限:。
  • chmod +x /path/to/your/script.php
  1. 检查日志
    查看或确认是否执行:
  2. /var/log/syslog
  3. cron.log
  4. bash
  5. tail -f /var/log/syslog | grep CRON

方法 2:使用 Windows 任务计划程序

适用场景:Windows 服务器。

步骤

  1. 创建批处理文件(如):
  2. run_task.bat
  3. bat
  4. @echo off
  5. php C:\path\to\your\script.php
  6. 在任务计划程序中
    • 设置触发器(如每天、每小时)。
    • 设置操作为运行。
  • run_task.bat

方法 3:模拟定时器(适用于无 cron 的共享主机)

适用场景:无法使用,但可以访问网站。

cron

方案 1:通过 Web 请求触发

  1. 修改 PHP 脚本,使其可通过 URL 访问:
  2. php
  3. $lockFile = __DIR__ . '/cron.lock';
  4. $lastRunFile = __DIR__ . '/last_run.txt';
  5. // 防止并发执行
  6. if (file_exists($lockFile)) {
  7. die("任务正在运行...");
  8. touch($lockFile);
  9. // 检查是否到执行时间(例如每 5 分钟)
  10. $lastRun = file_exists($lastRunFile) ? (int)file_get_contents($lastRunFile) : 0;
  11. $now = time();
  12. if ($now - $lastRun >= 300) { // 300 秒 = 5 分钟
  13. file_put_contents($lastRunFile, $now);
  14. // 执行任务
  15. file_put_contents('cron.log', date('Y-m-d H:i:s') . " 任务执行\n", FILE_APPEND);
  16. echo "任务完成";
  17. } else {
  18. echo "未到执行时间";
  19. // 解除锁定
  20. unlink($lockFile);
  21. 通过外部服务触发(如EasyCron):
    • 设置每分钟访问。
  • http://yoursite.com/cron.php

方案 2:长轮询(不推荐)

php

ignore_user_abort(true); // 用户断开连接后继续执行

set_time_limit(0); // 无时间限制

while (true) {

// 执行任务

file_put_contents('cron.log', date('Y-m-d H:i:s') . " 任务执行\n", FILE_APPEND);

sleep(60); // 每分钟检查一次

⚠️缺点:依赖 PHP 进程持续运行,可能被服务器终止。

方法 4:使用第三方调度服务

  • EasyCronDead Man's Snitch:通过 HTTP 请求触发你的 PHP 脚本。
  • Laravel Task Scheduling(如果使用 Laravel):然后通过每分钟调用。
  • php
  • // app/Console/Kernel.php
  • protected function schedule(Schedule $schedule) {
  • $schedule->command('email:send')->daily();
  • cron
  • php artisan schedule:run

最佳实践建议

  1. 优先使用:它是 Linux 下最稳定的方式。
  2. cron
  3. 避免精确到秒级:最小间隔是 1 分钟,如需更频繁,可在脚本内用调整。
  4. cron
  5. sleep()
  6. 防止并发执行:使用锁文件(如)避免重复运行。
  7. cron.lock
  8. 记录日志:方便排查问题。

总结

方法

适用环境

可靠性

Cron

Linux 服务器

⭐⭐⭐⭐⭐

最佳选择

Windows 任务计划

Windows 服务器

⭐⭐⭐⭐

适用于 IIS

Web 触发 + 外部服务

共享主机

⭐⭐

依赖第三方

长轮询

任何 PHP 环境

不推荐生产环境

如果你的服务器支持,强烈推荐方法 1;如果是共享主机,可以用方法 3 + 外部触发服务

cron