在 Ubuntu 上给 PHP 写“定时任务”,最常用、最标准的做法是用 crontab。下面按“从入门到常用场景”给你讲清楚。
例如:
<?php
// /var/www/html/cron/test.php
file_put_contents('/tmp/cron_test.log', date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);
which php
常见结果:
/usr/bin/php
crontab -e
如果是第一次用,会让你选编辑器,推荐 nano 或 vim。
例如:每分钟执行一次
* * * * * /usr/bin/php /var/www/html/cron/test.php >> /tmp/php_cron.log 2>&1
✅ 说明:
* * * * *:每分钟/usr/bin/php:PHP 可执行文件>> /tmp/php_cron.log 2>&1:记录输出和错误cat /tmp/cron_test.log
| 需求 | Crontab |
|---|---|
| 每分钟 | * * * * * |
| 每 5 分钟 | */5 * * * * |
| 每小时 | 0 * * * * |
| 每天凌晨 2 点 | 0 2 * * * |
| 每周一凌晨 3 点 | 0 3 * * 1 |
| 每月 1 号 | 0 0 1 * * |
sudo crontab -e
适合:
php artisan schedule:run
php think schedule
php your_script.php
❌ 不推荐:curl 访问 URL
curl http://localhost/cron.php
原因:
1. 在 crontab 只写一行
* * * * * cd /var/www && php artisan schedule:run >> /dev/null 2>&1
2. 在 app/Console/Kernel.php 里定义时间
protected function schedule(Schedule $schedule)
{
$schedule->command('demo:task')->daily();
}
用:
which php
不要用相对路径。
chmod +x /var/www/html/cron/test.php
cron 的 PATH 和你的 shell 不一样。
✅ 解决:
<?php
putenv('PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin');
grep CRON /var/log/syslog
适合:
我可以单独给你讲 systemd timer vs crontab 的区别。
Ubuntu 上 PHP 定时任务 = crontab + php cli
如果你愿意,可以告诉我:
我可以直接帮你写 可用配置。