php orm 内存泄漏,Lavarel Eloquent ORM常驻进程下的内存溢出问题

博客讲述了在业务中使用Laravel的Eloquent ORM进行数据库操作时遇到的内存溢出问题。问题出现在一个cron任务中,由于长时间运行导致内存不断增长。作者通过断点调试发现,每次查询数据时内存增加约3MB,最终引发内存溢出。解决方案是关闭Eloquent的查询日志,通过调用`disableQueryLog()`方法防止内存积累。修改后的代码成功解决了内存溢出问题。
摘要由CSDN通过智能技术生成

Laravel 的 Eloquent ORM 提供了漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,并将新记录添加到数据表中。

业务里使用了ORM来进行数据库操作,有个cron运行一段时间后就报内存溢出的错误,之前一直没时间彻底解决,这次有时间彻底搞清楚了。

代码类似:$capsule = new Capsule;

foreach ($database[$env] as $name => $conf) {

// 创建链接

$capsule->addConnection($conf, $name);

}

// 设置全局静态可访问

$capsule->setAsGlobal();

// 启动Eloquent

$capsule->bootEloquent();

while (1) {

try {

$service = new PostModel();

$dataList = $service->where('status', 1)->limit(100)->get()->toArray();

} catch (Exception $e) {

continue;

}

if (!$dataList) {

break;

}

foreach ($dataList as $data) {

// do something

// 最后会更新status字段=2

}

}

断点调试,发现每查询一次数据,内存就会增长3M左右,运行30次左右,就会报内存溢出。

怀疑是不是ORM这里会记录每次的查询结果,搜索了一下,发现还真有类似功能。

Laravel Eloquent display query log

最终实现代码:$capsule = new Capsule;

foreach ($database[$env] as $name => $conf) {

// 创建链接

$capsule->addConnection($conf, $name);

// 关闭查询日志,常驻进程会导致内存溢出

$capsule->getConnection($name)->disableQueryLog();

}

// 设置全局静态可访问

$capsule->setAsGlobal();

// 启动Eloquent

$capsule->bootEloquent();

while (1) {

try {

$service = new PostModel();

$dataList = $service->where('status', 1)->limit(10)->get()->toArray();

} catch (Exception $e) {

continue;

}

if (!$dataList) {

break;

}

foreach ($dataList as $data) {

// do something

// 最后会更新status字段=2

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值