用PHP模拟Cron任务:解决主机仅支持30分钟执行间隔的问题
解决LMS每分钟Cron任务与主机30分钟限制的冲突问题
你的脚本只执行一次,大概率是路径错误、执行命令不完整,或者进程被主机中断导致的。下面是具体的排查和修正方案:
一、给脚本加日志定位问题
因为Cron后台运行看不到输出,必须把执行过程记录到日志里。修改cron_script.php如下:
<?php set_time_limit(0); // 换成你有权限写入的绝对路径,比如主机的日志目录或自己创建的文件夹 $log_file = '/home/你的用户名/logs/cron_loop.log'; $turns = 0; // 记录脚本启动时间 file_put_contents($log_file, "脚本启动:" . date('Y-m-d H:i:s') . "\n", FILE_APPEND); while ($turns < 30) { $start_time = date('Y-m-d H:i:s'); file_put_contents($log_file, "第{$turns}次执行开始:{$start_time}\n", FILE_APPEND); // 关键:用绝对路径执行,避免Cron工作目录差异 $php_cli_path = '/usr/bin/php'; // 可通过SSH执行`which php`获取真实路径 $cron_file_path = '/home/你的用户名/public_html/training/admin/cli/cron.php'; // cron.php的绝对路径 $output = []; $return_code = 0; // 2>&1 是把错误输出重定向到标准输出,方便记录错误 exec("{$php_cli_path} {$cron_file_path} 2>&1", $output, $return_code); // 记录执行结果 $end_time = date('Y-m-d H:i:s'); file_put_contents($log_file, "第{$turns}次执行结束:{$end_time},返回码:{$return_code}\n", FILE_APPEND); if (!empty($output)) { file_put_contents($log_file, "执行输出:" . implode("\n", $output) . "\n", FILE_APPEND); } sleep(60); $turns++; } file_put_contents($log_file, "脚本执行完成:" . date('Y-m-d H:i:s') . "\n", FILE_APPEND); ?>
二、确认路径正确性
- PHP CLI路径:SSH登录主机,执行
which php,得到的就是系统默认的PHP命令绝对路径,比如/usr/local/bin/php - cron.php绝对路径:通过主机面板的文件管理器查看,或者在SSH里进入
training/admin/cli目录,执行pwd获取完整路径 - 日志文件路径:确保目标目录有写入权限,可先手动创建
logs文件夹并设置权限为755
三、先手动测试脚本
不要直接等Cron触发,先在SSH里手动运行:
php /你的cron_script.php的绝对路径
观察日志文件是否正常生成,每一分钟是否有新的执行记录,这样能快速排查路径、权限或命令错误。
四、应对主机进程超时限制
如果主机限制单个进程运行时间(比如超过10分钟就强制终止),30分钟的循环脚本会被中断。可以拆分任务:
设置3个Cron任务,每个任务执行10次(运行10分钟):
- 每小时的0分、30分执行:
php /path/to/cron_script_10times.php(脚本里循环10次) - 每小时的10分、40分执行:同上
- 每小时的20分、50分执行:同上
这样每个脚本只运行10分钟,避免被主机中断,同时保证每分钟都有一次Cron执行。
内容的提问来源于stack exchange,提问作者user2860417
相关产品推荐
相关产品推荐

