报错不显示主因是errorhandler拦截静默吞掉或错误未进入yii日志通道;须同时启用yii_debug=true、配置errorhandler→erroraction、确保error视图存在且可访问,缺一即白屏。

报错不显示,基本是因为被 Yii 的 errorHandler 拦截后静默吞掉、或根本没走到 Yii 日志通道里。直接开 YII_DEBUG = true 并配对错误显示路径,是最快见效的方式。
YII_DEBUG 和 errorAction 必须同时生效
Yii2 默认在非调试模式下只返回“An internal server error occurred”,不暴露任何细节。必须确认两点都到位:
-
web/index.php开头有defined('YII_DEBUG') or define('YII_DEBUG', true);,且未被注释 -
config/web.php的components里明确配置了'errorHandler' => ['errorAction' => 'site/error'] -
@app/views/site/error.php文件存在,且里面用了$name和$message(这是 Yii 自动传入的变量)
漏掉任意一项,ES 报错就只会变成白屏或 500 响应体空内容。
ES 请求失败时的错误藏在哪儿
Elasticsearch 扩展本身不主动抛出可捕获异常,很多错误是 HTTP 层返回 4xx/5xx 后被 quietly 忽略。常见表现:
-
Cluster autodetection did not find any active node:连接配置错,nodes地址 PHP curl 访问不通 -
failed to parse source:DSL JSON 格式不对,比如query外层少包了一层对象,或用了 ES 7 不支持的_type -
cURL error 28: Operation timed out:bulk 写入时 batch-size 太大或 timeout 太短
这类错误不会进 Yii::error(),除非你手动 catch 并记录。建议在调用 createCommand()->search() 前加 try/catch:
try {
$rows = $command->search($query)->all();
} catch (\yii\elasticsearch\Exception $e) {
Yii::error('ES search failed: ' . $e->getMessage(), 'elasticsearch');
throw $e;
}
日志里看不到 ES 错误?检查 log targets 的 levels 配置
即使开了 YII_DEBUG,如果日志组件没配 error 级别,ES 抛出的异常也不会落地:
- 检查
config/web.php中'log' => ['targets' => [...]]的每个 target,确认'levels' => ['error', 'warning', 'info']包含'error' -
runtime/logs/app.log对应的真实路径是否 web 用户可写(常见权限问题) - 别把 console 的 log 配置错贴到 web 配置里——两者完全隔离
更隐蔽的问题:ES 客户端底层用的是 elasticsearch/elasticsearch 包,它内部的异常类型是 \Elasticsearch\Common\Exceptions\BadRequest400Exception,不是 Yii 自家的 Exception 子类,所以如果你只 catch \yii\base\Exception,它就彻底漏掉了。
最常被忽略的是:错误发生在 index.php 初始化之前(比如扩展缺失、PHP 解析失败),这种错误压根不会经过 Yii,只能查 PHP 错误日志(error_log 配置项指向的文件)和 Web 服务器 error log。











