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

Laravel 7 cPanel环境下任务调度Cron作业不运行问题求解

问题排查与解决方案

核心故障原因

你手动执行调度命令能正常运行,说明Kernel.php内的任务规则本身没有问题,定时任务不触发的根本原因是配置的Cron作业命令路径完全错误:

  • 当前命令里写的/https://subdomain.maindomain.com/php artisan是HTTP访问路径,Cron是服务器本地执行的系统任务,只能识别服务器本地的文件系统绝对路径,根本无法解析HTTP格式的路径,自然不会触发调度。

正确配置步骤

  • 第一步:确认子域名对应项目的本地绝对路径。Namecheap cPanel中子域名的根目录默认格式为/home/你的cPanel登录用户名/public_html/子域名对应目录/,Laravel项目的artisan文件就存放在项目根目录下。
  • 第二步:替换Cron执行命令为正确格式,参考如下:
/usr/local/bin/php /home/你的cPanel用户名/子域名项目根目录的实际路径/artisan schedule:run >> /dev/null 2>&1

举个实际示例:如果你的cPanel用户名为myhost,子域名对应的项目存放在/home/myhost/public_html/subapp目录下,那么对应命令为:

/usr/local/bin/php /home/myhost/public_html/subapp/artisan schedule:run >> /dev/null 2>&1

关于调度频率的说明

不需要让Laravel内的任务调度频率和主机Cron执行频率完全保持一致,两者的运行逻辑是:

  • 主机Cron的作用是按固定间隔触发Laravel的schedule:run命令,相当于给Laravel调度器发一个“到点检查任务”的信号
  • Laravel收到信号后,会自动遍历Kernel里配置的所有任务,核对当前时间是否匹配任务预设的执行规则,匹配才会执行任务,不匹配则直接跳过

针对你当前的主机环境和业务需求,注意两点:

  • 你的主机Cron最低执行间隔为5分钟,因此Laravel内配置的任务最小执行间隔不能低于5分钟。你现在测试用的everyMinute()规则无法实现每分钟执行,最多每5分钟触发一次检查,测试阶段可以临时把调度规则改成everyFiveMinutes()验证通路是否正常。
  • 你需要的每月最后一天执行的业务需求,不需要调整Cron频率,直接在Kernel中把调度规则改成->lastDayOfMonth('你要执行的具体时刻,比如09:00')即可,保留Cron每5分钟执行一次的配置:到了每月最后一天的指定时刻,当次Cron触发的检查会命中执行规则,自动运行任务,其余时间检查不满足规则会直接跳过,完全符合业务要求。

额外排查提示

  • 确认Cron调用的PHP版本和你Laravel项目实际使用的PHP版本一致,不确定PHP路径的话可以直接在cPanel的Cron Jobs配置页选择系统提供的对应版本PHP路径,替换/usr/local/bin/php部分,避免版本兼容问题导致命令报错。
  • 测试阶段不要把输出重定向到/dev/null,可以先把输出写入日志文件方便排查,命令参考:
/usr/local/bin/php 你的artisan文件绝对路径 schedule:run >> /home/你的cPanel用户名/schedule_debug.log 2>&1

等Cron跑几次后查看日志文件内容,确认没有报错、任务正常执行后,再改回重定向到/dev/null丢弃输出即可。

  • 如果路径配置正确还是无法执行,检查项目根目录下的artisan文件权限,设置为755即可。

内容的提问来源于stack exchange,提问作者Shan Md Shazarul Haque 171-15-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:36:26