我正在努力在 Laravel 6.x 中使用 cursor()
方法获取 3M+ 记录时降低内存。
我有一个 artisan 命令运行以下代码:
Product::cursor()->each(function ($product) {
calculateStats::dispatch($product);
});
根据文档,它应该会导致内存使用率较低,但内存会不断爬升,直到达到我的 2G 限制。
我读到这可能是因为 PDO 连接使用缓冲查询,所以我尝试在运行查询之前添加此内容:
\DB::connection()->getPdo()->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
从这里:https://github.com/laravel/framework/issues/14919
这导致启动内存使用量较低,但结果仍然相同。
我还尝试将其添加到 database.php
配置文件中,但结果相同。
我正在使用 MySQL 8,如果这有什么区别的话。
我使用 dispatch()
方法将其分发给工作人员,因为一次处理它们需要很长时间。
关于如何解决内存问题有什么好的建议吗?
编辑
经过一些额外的调试后,我觉得是作业调度占用了内存。 由于作业已经发送到 Redis 队列,如何从内存中释放它?
FIY:设置使用 Redis 和 Horizon。
最佳答案
就我而言,Laravel 的 Telescope 插件保留了对分派(dispatch)作业的引用,在运行 10,000 多个作业时导致非常明显的内存泄漏。
关于php - 分派(dispatch)的作业保留在内存中,导致内存使用率较高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58897350/