最直接可靠的方式是判断 php_sapi === 'cli';其他方法如 runninginconsole() 是封装、argv 或 request_method 检测不严谨;artisan 命令的 handle() 方法天然仅在 cli 中执行。

在 Laravel 中,判断当前是否运行于 CLI 模式,最直接可靠的方式是检查 PHP 的 SAPI 类型,而不是依赖框架层面的“环境变量”或“配置项”——因为环境(如 APP_ENV=local)可能在 Web 和 CLI 下完全一致,无法反映执行上下文。
用 PHP_SAPI 判断最准确
PHP_SAPI 是 PHP 内置常量,表示当前服务器 API 类型。CLI 模式下它的值固定为 'cli'(小写),其他常见值包括 'apache2handler'、'fpm-fcgi' 等。
- ✅ 推荐写法(简洁、可靠、无依赖):
if (PHP_SAPI === 'cli') { /* 当前是 artisan 或 php script.php */ } - ❌ 不要用
app()->runningInConsole()来“判断是否 CLI”——它本质就是封装了PHP_SAPI === 'cli',但多一层调用且在某些早期版本或自定义 SAPI 下可能不准;不过它仍是 Laravel 官方推荐的语义化方式,适合业务逻辑中使用 - ❌ 避免用
isset($_SERVER['argv'])或!isset($_SERVER['REQUEST_METHOD']):这些不是 CLI 的充分条件,比如某些 CGI 或调试工具也可能设了argv,而 CLI 脚本若被封装调用也可能不带argv
在 Artisan 命令中无需额外判断
所有继承 Illuminate\Console\Command 的命令类,其 handle() 方法天然只会在 CLI 下执行。Laravel 的 Console Kernel 会拦截所有非 CLI 请求,根本不会把控制权交给你的命令。所以只要代码在 handle() 里,就一定是 CLI。
- 不需要在
handle()开头写if (! app()->runningInConsole()) die(); - 如果想让某段逻辑“仅在 Web 请求中运行”,才需要显式排除 CLI;反之,CLI 逻辑默认安全隔离
区分 CLI 和 Web 的典型用途
判断 CLI 模式常用于以下场景,注意对应写法:
- 加载不同配置:CLI 下跳过某些 Web 专用中间件配置或日志通道(如 Slack、Webhook)
- 禁用耗时初始化:如跳过前端资源编译检查、浏览器检测、CSRF token 生成等
-
调整日志级别或路径:CLI 任务可单独记录到
storage/logs/artisan-*.log -
避免触发 HTTP 相关异常:例如不调用
redirect()、request()->fullUrl()、session()等 Web 专属功能
核心就一条:CLI 和 Web 是两个独立生命周期,PHP_SAPI === 'cli' 是底层事实依据,其余都是封装或误判。用对地方,比猜环境更稳。











