codeigniter的cli模式分ci3和ci4两种实现:ci3直接通过php index.php [class] [method]调用控制器,需校验cli环境并禁用web专属功能;ci4必须继承basecommand、置于app/commands/下、类名以command结尾,并通过spark命令执行,不可直运行php文件。

CodeIgniter 的 CLI 模式是运行后台任务、定时作业和维护脚本的核心方式,它绕过 Web 请求流程,直接加载框架上下文,安全高效。关键不是“能不能跑”,而是“怎么跑对”——尤其在 CI3 和 CI4 中机制差异明显,用错方式容易报 Class 'Config\Services' not found 或命令不识别。
CI3:直接调用控制器方法
CI3 的 CLI 支持开箱即用,无需额外类或目录约定。只要控制器继承 CI_Controller,就能通过 php index.php [class] [method] [args] 执行:
- 确保
index.php顶部有标准 CLI 入口判断(CI3 默认已含):if (php_sapi_name() !== 'cli' && php_sapi_name() !== 'phpdbg') { exit('No direct script access allowed'); } - 控制器中可用
$this->input->is_cli_request()做环境分支,避免敏感操作被 Web 端误触发 - 禁用 Web 专属功能:如
redirect()、set_cookie()、Session 初始化等,在 CLI 下会失效或报错 - 输出用
echo+PHP_EOL,别依赖视图;日志写入log_message('error', '...')更可靠
CI4:必须用 spark + BaseCommand
CI4 不再支持直接调用控制器,所有 CLI 脚本必须封装为 BaseCommand 子类,放在 app/Commands/ 目录下:
- 类名必须以
Command结尾(如SendEmailCommand),否则spark list不显示 - 必须设置
$this->group和$this->description,这是命令可见性的前提 - 参数获取统一用
$this->getArgument('name')或$this->getOption('force'),不用$argv - 输出统一用
$this->info()/$this->error(),保证颜色、换行和 CLI 友好性 - 绝对不能直接
php SendEmailCommand.php—— 必须走php spark send:email入口,否则框架服务容器未启动
接入 crontab 定时执行
Linux 的 crontab 不读用户 shell 配置,PATH 和 PHP 环境常与手动执行不一致,这是最常见的失败原因:
- crontab 条目推荐写成绝对路径调用:
0 2 * * * /usr/bin/php /var/www/myapp/spark backup:db --force >> /var/log/ci-backup.log 2>&1 - 确认
/usr/bin/php是你项目实际使用的 PHP 版本(可通过which php查) - 工作目录很重要:crontab 默认在
/执行,spark 需要从项目根目录运行,所以要么 cd 进去再执行,要么用完整路径 - 调试先手动模拟 crontab 环境:
env -i PATH=/usr/bin:/bin /usr/bin/php /path/to/spark your:command
常见问题快速排查
CLI 跑不通?优先检查这三项:
-
日志权限:确保
writable/logs/目录对运行 cron 的用户(如 www-data 或 nobody)可写 -
PHP 环境差异:CLI 使用的 php.ini 通常和 Web 不同(
php -i | grep 'Loaded Configuration File'对比) -
工作目录错误:spark 必须在项目根目录执行,否则自动加载器找不到类;可在 crontab 前加
cd /path/to/project &&











