Laravel计划任务调度查询myproj_cache_illuminate:schedule:interrupt失败
解决方案:Laravel Schedule Cron执行时MySQL连接错误(SQLSTATE[HY000] [2002])
问题根源
其他功能正常但Cron执行schedule:run报错,核心原因是CLI环境与Web环境的MySQL连接配置不一致。CentOS 7和Ubuntu 22.04的MySQL默认Socket路径不同:
- CentOS 7:
/var/lib/mysql/mysql.sock - Ubuntu 22.04:
/run/mysqld/mysqld.sock
Cron执行时使用的CLI环境可能仍在读取旧的Socket路径,导致无法连接MySQL。
具体解决步骤
确认Ubuntu服务器的MySQL Socket路径
在终端执行以下命令,获取当前MySQL实际使用的Socket路径:mysql -e "show variables like 'socket'"输出类似:
+---------------+---------------------------+ | Variable_name | Value | +---------------+---------------------------+ | socket | /run/mysqld/mysqld.sock | +---------------+---------------------------+修正项目的数据库配置
打开项目根目录的.env文件,更新DB_SOCKET配置为上一步获取的路径:DB_SOCKET=/run/mysqld/mysqld.sock若
.env中无DB_SOCKET项,直接添加即可。确保Cron任务加载正确的环境与路径
编辑Cron任务时,必须指定项目目录和完整的PHP路径(避免Cron使用系统默认的PHP版本/配置)。示例Cron规则:* * * * * cd /path/to/your/laravel-project && /usr/bin/php artisan schedule:run >> /dev/null 2>&1- 替换
/path/to/your/laravel-project为实际项目路径 - 替换
/usr/bin/php为服务器上PHP CLI的实际路径(可通过which php获取)
- 替换
验证CLI环境的数据库连接
在终端进入项目目录,执行以下命令测试CLI环境下的数据库连接:php artisan tinker在Tinker中执行:
DB::connection()->getPdo();若返回PDO对象则连接正常,若报错则检查PHP CLI的mysql扩展是否安装,或配置是否正确。
可选:硬编码Socket路径到配置文件
若.env配置仍不生效,可直接在config/database.php的MySQL配置中指定Socket:'mysql' => [ // ...其他配置 'unix_socket' => env('DB_SOCKET', '/run/mysqld/mysqld.sock'), ],
额外说明
手动插入cache表条目无效,是因为错误发生在数据库连接阶段,而非SQL执行阶段——Cron任务根本没连上MySQL,所以无论表中有没有数据都会报错。
内容的提问来源于stack exchange,提问作者Keith M
相关产品推荐
相关产品推荐

