ThinkPHP伪静态仅在Web请求中生效,依赖URL重写与路由解析;CLI模式走独立入口,不加载伪静态规则、不触发路由匹配,所有重写配置对其无效。

ThinkPHP 伪静态和 CLI 命令行模式是两个独立场景,不能混用 —— 伪静态只在 Web 请求中生效(index.php 入口),而 CLI 模式走的是纯命令行入口(如 cli.php),不经过任何 URL 重写或路由解析。
伪静态规则对 CLI 完全无效
你在 .htaccess、web.config 或 Nginx location 里写的重写规则,只作用于 HTTP 请求。CLI 执行时直接调用 PHP 解释器运行脚本,$_SERVER['REQUEST_URI'] 根本不存在,$_GET 和 PATH_INFO 也为空。所有伪静态路由、__pattern__ 匹配、url_route_on 配置,在 CLI 下完全不加载、不触发。
- 执行
php cli.php home/article/get时,框架靠的是命令行参数解析,不是 URL 路由 -
route.php中定义的Route::rule('article/:id', ...)在 CLI 中不会被匹配 - 别试图在 CLI 入口里加
$_SERVER['PATH_INFO'] = '/article/123'来“模拟”伪静态 —— ThinkPHP 的路由初始化逻辑根本不会走那条路径
CLI 模式下怎么实现多语言支持
ThinkPHP 的多语言(lang)机制默认依赖请求上下文(如 cookie、header、URL 参数),CLI 环境没有这些。必须手动指定语言标识,并确保语言包能被正确加载。
- 在
cli.php入口文件顶部,强制设置语言常量:define('LANG_SET', 'zh-cn');或define('LANG_SET', 'en-us'); - 确保语言包路径存在且命名规范:例如
Application/Lang/zh-cn/common.php,否则Lang::get('hello')返回空字符串 - 避免依赖自动检测:不要用
Lang::detect(),它会读$_SERVER['HTTP_ACCEPT_LANGUAGE'],CLI 下该值为空 - 如果命令行需要动态切换语言,建议通过参数传入:
php cli.php home/article/get --lang=ja-jp,然后在命令逻辑里调用Lang::range($lang)
为什么 APP_MODE = 'cli' 后还要改路径和删日志类
ThinkPHP 的 Mode/common.php 是 Web 模式下的基础配置,直接复用到 CLI 会出问题:
立即学习“PHP免费学习笔记(深入)”;
-
'Think\Log' => CORE_PATH . 'Log'.EXT这行会导致 CLI 启动时报错 —— 因为 CLI 默认不加载日志驱动,Log类未注册,Log::init()失败 - 相对路径(如
./Application/)在 CLI 下容易因执行目录不同而失效,必须用dirname(__FILE__)转成绝对路径 -
APP_DEBUG在 CLI 下仍可开启,但错误信息直接输出到终端,无需 HTML 包裹 —— 不影响功能,但调试更直接
真正容易被忽略的是缓存污染:CLI 和 Web 共享同一套缓存目录(如 Runtime/Cache/),如果 CLI 命令修改了配置或生成了缓存,Web 请求可能读到过期或冲突的数据。每次部署 CLI 任务前,务必清空 Runtime/ 下所有子目录,而不是只删 Cache/。



















