迁移到AWS DocumentDB后出现bson_append_array()无效数组告警如何解决?
触发原因
- 该警告由PHP的
mongodb底层扩展抛出,不属于PHP用户态错误,因此修改php.ini的display_errors配置、使用@错误抑制符均无法拦截。 - 根因是AWS DocumentDB 4.0与原生MongoDB的返回结构存在差异:部分游标元数据、系统字段(如
$clusterTime)中的数组为非0起始的关联数组格式,而老版本mongodb扩展序列化BSON时要求数组必须为从0开始的索引数组,校验不通过就会触发该告警。 - CLI场景下默认会输出扩展产生的stderr日志,因此告警只会在CLI脚本执行时出现。
解决方案
方案1:升级MongoDB相关依赖(最省心)
- 升级
pecl/mongodb扩展到1.12.0及以上版本,该版本新增了对DocumentDB返回结构的兼容逻辑,默认关闭非索引数组的告警校验。 - 同步升级Composer依赖的
mongodb/mongodb库到1.10.0及以上版本,匹配扩展版本即可消除告警。
方案2:配置全局类型映射(无需升级依赖)
在Lumen框架的入口文件bootstrap/app.php中添加全局类型映射配置,将查询返回的数组强制转为对象,跳过BSON数组校验:
<?php MongoDB\Driver\Manager::setGlobalTypeMap([ 'array' => 'stdClass', 'document' => 'stdClass', 'root' => 'stdClass' ]);
方案3:修改php.ini扩展配置(无需改业务代码)
执行php --ini查看CLI对应的php.ini文件路径,编辑文件添加以下配置直接关闭该告警触发:
mongodb.warn_on_non_numeric_array_keys = Off
修改后重启CLI进程即可生效,若扩展版本低于1.11.0不存在该配置项,优先选择方案1或2。
内容的提问来源于stack exchange,提问作者M_R_K
相关产品推荐
相关产品推荐

