Laravel 10 Eloquent查询内存占用无限增长问题求助
以下是针对你遇到的问题的可能原因及对应排查方向:
Xdebug 兼容性与配置问题
启用Xdebug的调试/追踪模式时,带条件的Eloquent查询会触发大量ORM底层函数调用的追踪,空数据库场景下可能因递归追踪或过深的调用链导致内存溢出。而Member::all()因为是直接拉取空表数据,调用链更短,不会触发该问题。
排查方案:临时关闭Xdebug(设置xdebug.mode=off或注释扩展加载代码)测试;升级Xdebug到3.2+稳定版;检查xdebug.max_nesting_level配置,可尝试调高至512。全局作用域/模型观察者的逻辑冲突
Laravel升级到10后,自定义的全局作用域或模型观察者可能存在兼容问题,比如在处理查询条件时触发无限递归循环。这类逻辑只会在带条件的查询构建阶段生效,all()操作不会触发。
排查方案:临时注释Member模型中注册的全局作用域和观察者,逐一恢复排查哪个组件引发问题;检查模型boot()方法内的逻辑是否存在循环调用。数据库驱动的兼容性问题
PHP 8.2对数据库扩展(如pdo_mysql)的细节处理有调整,Laravel 10生成的WHERE MONTH()/WHERE YEAR()语法,在特定驱动版本下可能触发异常的查询解析逻辑,导致内存泄漏。
排查方案:用原生SQL替代Eloquent查询测试:DB::select("SELECT COUNT(*) FROM members WHERE MONTH(created_at) = ? AND YEAR(created_at) = ?", [$startDate->month, $startDate->year]);如果问题复现,升级数据库扩展到PHP 8.2兼容的最新版本(如mysqlnd 8.0+)。
模型属性转换/访问器的异常
若Member模型对created_at字段定义了自定义访问器或属性转换,在whereMonth/whereYear查询阶段可能触发递归调用,导致内存持续增长。all()操作仅在数据拉取后处理属性,不会在查询构建阶段触发该逻辑。
排查方案:检查模型的$casts数组和getCreatedAtAttribute类方法,暂时注释相关逻辑后测试。
内容的提问来源于stack exchange,提问作者Burak ER

