CodeIgniter 4 CLI执行Cron Job时SQLSRV数据库连接失败求助
问题分析与解决方案
这个错误的核心原因是CLI环境使用的PHP配置未启用SQLSRV扩展——Web服务器(如IIS/Apache)加载的是一套php.ini,而命令行(CLI)模式下的PHP加载的是另一套配置,两者并非共用同一个文件,导致Web端能正常使用的扩展在CLI环境中未启用。
解决步骤
1. 确认CLI使用的PHP版本
打开命令提示符(CMD),执行:
php -v
对比Web环境的PHP版本(可通过phpinfo()查看),确保两者版本一致。若版本不同,说明你安装了多个PHP,CLI使用的是未配置扩展的那一个。
2. 找到CLI对应的php.ini文件
在CMD中执行:
php --ini
查看输出里的Loaded Configuration File项,这就是CLI模式下PHP加载的配置文件路径。
3. 在CLI的php.ini中启用SQLSRV扩展
打开找到的php.ini文件,进行以下修改:
- 确认
extension_dir配置项指向正确的扩展目录(比如extension_dir = "ext",若为绝对路径则填写完整路径)。 - 添加或取消注释以下两行:
注意:如果你的PHP是非线程安全(NTS)版本,扩展文件名可能带有extension=sqlsrv extension=pdo_sqlsrvnts标识(如php_sqlsrv_nts_x64.dll),需确保文件名与php.ini中的配置一致。
4. 验证扩展是否启用
执行以下命令,查看输出列表中是否包含sqlsrv和pdo_sqlsrv:
php -m
5. 测试CLI数据库连接
创建一个简单的测试脚本(如test_sqlsrv.php),内容如下:
<?php $serverName = "localhost,1433"; $connectionOptions = [ "Database" => "dbtest", "Uid" => "myuser", "PWD" => "mypassword" ]; $conn = sqlsrv_connect($serverName, $connectionOptions); if ($conn === false) { die(print_r(sqlsrv_errors(), true)); } else { echo "数据库连接成功"; sqlsrv_close($conn); }
在CMD中执行:
php test_sqlsrv.php
若输出「数据库连接成功」,说明扩展配置正确。
6. 配置Windows任务计划(代替Cron)
Windows没有原生Cron,需用任务计划程序设置定时任务:
- 打开「任务计划程序」,点击「创建基本任务」。
- 设置任务名称(如「检查数据库定时任务」),触发器选择「每天」,再设置每15分钟重复一次。
- 操作选择「启动程序」,程序或脚本填写PHP的完整路径(如
C:\php\php.exe),添加参数填写Spark命令和控制器方法:C:\path\to\your\project\spark controller:yourMethod - 设置起始于为项目根目录(如
C:\path\to\your\project),完成配置。
内容的提问来源于stack exchange,提问作者Marco Marongiu
相关产品推荐
相关产品推荐

