必须启用yii_debug=1和yii_env=dev环境变量,同时在web/index.php开头强制设置error_reporting(e_all)和ini_set('display_errors', '1'),并确保runtime/目录权限正确、php扩展齐全,才能使容器中yii2显示详细错误信息。

默认情况下 Yii2 容器部署会屏蔽错误,必须显式开启调试模式并配置日志输出路径,否则 500 错误只返回空白页或通用提示。
如何让容器中 Yii2 显示详细错误信息
核心是两件事:启用 YII_DEBUG,并确保 error_reporting 和 display_errors 生效。Docker 内 PHP 默认关闭 display_errors,且 Yii2 的 index.php 入口通常会覆盖它。
- 在
index.php开头强制开启(部署时可临时加,上线前删):ini_set('display_errors', '1'); error_reporting(E_ALL); - 确保环境变量
YII_DEBUG=1和YII_ENV=dev已注入容器(例如docker run -e YII_DEBUG=1 -e YII_ENV=dev ...) - 检查
web/index.php中是否调用defined('YII_DEBUG') || define('YII_DEBUG', false);—— 若硬编码为false,环境变量无效,必须改成getenv('YII_DEBUG') === '1'这类动态判断
常见报错不显示的典型原因
不是代码写错了,而是错误根本没走到 Yii2 层就被 PHP 或 Web 服务器截断了。
-
Parse error或Fatal error出现在index.php或config/web.php里:这类错误发生在 Yii2 初始化前,只能靠 PHP 错误日志查看,display_errors对其无效 - Nginx 返回
502 Bad Gateway:说明 PHP-FPM 没响应,此时查/var/log/php-fpm/www-error.log或容器stderr输出,不是 Yii 日志 - Dockerfile 中用了
alpine镜像但没装php-opcache或php-mbstring:启动直接失败,docker logs里可见PHP Fatal error: Uncaught Error: Call to undefined function mb_strlen()
容器内快速验证错误是否可捕获
别等真实请求失败,用 CLI 直接触发初始化,能最快暴露问题。
- 进容器执行:
php yii
(若报错,说明基础依赖缺失或配置语法错误) - 手动加载关键配置:
php -r "require_once 'vendor/autoload.php'; var_dump(require 'config/web.php');"
,可定位config/下某文件的语法或路径问题 - 检查
runtime/目录权限:容器中常因 UID 不匹配导致mkdir(): Permission denied,错误被静默吞掉,需chown -R www-data:www-data runtime/
真正难排查的,往往是 PHP 扩展缺失、runtime 或 web/assets 权限不对、以及 index.php 里硬编码的 YII_DEBUG 值 —— 这些地方改完要重启 PHP-FPM 或重建容器,缓存不刷新就白调。











