命令行执行没输出,通常因输出被拦截或静默吞掉;应先确认错误日志是否启用,用php -i | grep "error_log"查看cli日志路径,若为no value则错误输出到stderr;artisan命令必须用$this->info()等封装方法输出,禁用echo/var_dump;确保命令已注册、缓存已清、docker中日志重定向至stdout。

命令行执行没输出,通常不是代码没跑,而是输出被拦截、重定向或静默吞掉了。重点先确认日志和错误是否真在产生,再逐层排查。
检查 PHP CLI 错误日志是否启用
Web 环境的 error_log 配置和 CLI 完全无关。运行以下命令查看 CLI 模式实际使用的错误日志路径:
- php -i | grep "error_log" —— 查看当前 CLI 的 error_log 设置
- 如果显示 error_log => no value,说明错误会打到 stderr,但终端可能被重定向或未显示
- 临时强制指定日志位置:php -d error_log=/tmp/cli-error.log artisan your:command
- 执行后立刻检查:cat /tmp/cli-error.log,看是否有 Fatal Error 或 Parse Error
Artisan 命令输出必须用封装方法
在自定义命令的 handle() 方法里,不能用 echo、print、var_dump 或 dd(),否则会导致:
- 颜色丢失、换行错乱
- 测试断言失败(如
assertExitCode(0)失效) - 部分环境(如 Docker)下输出被缓冲甚至丢弃
正确写法是统一使用 Artisan 提供的方法:
- $this->info('任务开始') —— 绿色文字,带换行
- $this->error('出错了') —— 红色文字
- $this->line('原始内容') —— 无样式纯文本
- 调试变量:$this->line(var_export($data, true))
确认命令是否真被注册和加载
常见“执行没反应”其实是命令根本没运行——比如类没注册、自动加载失效、缓存未清:
- 运行 php artisan list,看你的命令是否出现在列表中
- 不在列表?检查:app/Console/Commands/ 目录下文件是否存在、命名空间是否为
App\Console\Commands、是否继承Illuminate\Console\Command - Laravel 8+ 默认支持自动发现,但若改过目录结构或命名空间,仍需手动加进
app/Console/Kernel.php的$commands数组 - 部署后务必执行:php artisan config:clear && composer dump-autoload
Docker 环境下日志必须走 stdout
容器日志只捕获 stdout,stderr 不会被 docker logs 收集(除非重定向)。Laravel 默认 stderr 通道若仍写 php://stderr,就会“看不见”:
- 修改
config/logging.php中stderr驱动的stream值为:'php://stdout' - 确保
.env中有:LOG_CHANNEL=stderr 和 LOG_LEVEL=debug - 执行 php artisan config:clear,再重启容器
- 验证:docker logs -f
,触发命令,应立即看到结构化日志











