codeigniter 4 的 cli 工具 spark 开箱即用,而 ci3 需手动调用 index.php 并确保 php_sapi === 'cli';常见失效原因包括 web 环境 exec 调用、windows 双击运行或未在项目根目录执行命令,正确方式是终端进入根目录运行 php index.php tools test(ci3)或 php spark tools:test(ci4),并用 var_dump(php_sapi) 验证输出为 "cli"。

CodeIgniter 4 的 CLI 工具(spark)是开箱即用的,不需要额外配置;而 CodeIgniter 3 没有内置 CLI 入口,必须手动调用 index.php 并确保环境识别为 CLI —— 这是绝大多数人卡住的第一步。
怎么确认当前是 CLI 环境(is_cli() 为什么失效)
CI3 和 CI4 都依赖 PHP_SAPI === 'cli' 判断,但常见问题不是函数本身错,而是运行方式不对:
- 在 Web 服务器里用
exec('php index.php tools test')调用:此时子进程是 CLI,但父进程仍是 Web,$this->input->is_cli_request()在控制器里返回false - 直接双击运行
index.php(Windows 图形界面下):PHP_SAPI可能是cgi-fcgi或空,不是cli - CI3 中未显式调用
is_cli_request()就进控制器逻辑,结果路由、Session、Output 类可能因非 CLI 上下文报错
✅ 正确做法:终端进入项目根目录,明确用 php index.php tools test(CI3)或 php spark tools:test(CI4),并用 var_dump(PHP_SAPI); 确认输出为 string(3) "cli"。
php spark 命令不识别 / 报错“command not found”
这是 CI4 特有路径和权限问题,和系统 PATH 无关:
ApiPost是一个支持团队协作,支持模拟POST、GET、PUT等常见请求,并可直接生成文档的API调试、管理工具,ApiPost是后台接口开发者或前端、接口测试人员的工作必备工具。快速生成、一键导出API文档。感兴趣的朋友快来下载吧。软件说明ApiPost官方版是一款十分出色的接口调试与文档生成工具,ApiPost官方版界面美观大方,功能强劲实用,支持团队协作,支持模拟POST、GET、PUT等常见请求,是后台接口开发者或前端、接口测试人员的工作必备工具。软件特色更方便支持接口调试的同时快速生成、一键
-
spark是项目根目录下的可执行脚本(Linux/macOS)或批处理文件(Windows),不是全局命令。必须在项目根目录下运行,不能在app/或public/下 - Linux/macOS 下若提示
Permission denied,需先执行chmod +x spark - Windows 下如果用 Git Bash 运行失败,改用 CMD 或 PowerShell;若仍报错,检查是否误删了
spark文件头部的#!/usr/bin/env php行(CI4.4+ 已移除此行,但旧项目可能残留) - CI4.5+ 默认禁用部分命令(如
spark serve)在生产环境运行,检查APP_ENV是否设为production,临时改为development测试
自定义 CLI 命令传参失败($params 为空或顺序错)
CI4 的 BaseCommand::run(array $params) 接收的是「位置参数」,不自动解析选项(--flag)或命名参数(key=value):
-
php spark user:import users.csv --force中,$params只包含['users.csv'],--force需通过$this->getOption('force')获取 - 定义
protected $arguments = ['file' => 'CSV 文件路径'];后,file是必填项,不传会直接报错退出,不会进run() - CI3 完全无参数解析机制,所有参数都进
$this->uri->segments或$argv,需手写array_slice($argv, 2)提取 - 避免在 CI3 CLI 控制器中用
$this->input->get()或post(),它们返回空 —— 改用$this->uri->segment(3)或直接读$argv
CLI 执行时输出被缓冲 / 日志没写入 / 数据库连接失败
CLI 和 Web 请求共享配置,但默认行为不同:
- CI4 的
database.default.DBDriver若设为MySQLi,CLI 下可能因未加载扩展报错,改用PDO更稳妥('DBDriver' => 'MySQLi'→'DBDriver' => 'MySQLi'保持不变,但确认extension=mysqli在 CLI 的php.ini中启用,可用php -m | grep mysqli验证) - 日志写入失败常因 CLI 用户(如
www-data)无权写writable/logs/目录,用ls -ld writable/logs检查权限,必要时chown -R $USER:writable writable/logs - 输出被缓冲:CI4 默认开启输出缓冲,CLI 下建议在命令开头加
ob_end_flush();,或用CLI::write()替代echo,它会自动flush() - CI3 中
log_message()默认只写到文件,CLI 下看不到屏幕输出,如需实时反馈,加echo或用error_log()
最易忽略的是:CI4 的 .env 文件在 CLI 下默认加载,但如果你用 php -d variables_order=EGPCS spark list 这类带额外参数的调用,可能绕过环境加载逻辑 —— 不要加多余 -d 参数,除非你清楚影响范围。










