php - 分派(dispatch)的作业保留在内存中,导致内存使用率较高

标签 php laravel redis

我正在努力在 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 和 Horizo​​n。

最佳答案

就我而言,Laravel 的 Telescope 插件保留了对分派(dispatch)作业的引用,在运行 10,000 多个作业时导致非常明显的内存泄漏。

关于php - 分派(dispatch)的作业保留在内存中,导致内存使用率较高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58897350/

相关文章:

php - 如何在 PHP 中使用递归计算阶乘

Php Laravel 5.1-无法与主机 smtp.gmail.com 建立连接 [Connection refused #111]

php - Eloquent 更新在 laravel 5.6 中不起作用

python - Django channel Redis : Exception inside application: Lock is not acquired

node.js:为什么 NODE_DEBUG=1 不起作用? (试图调试 require() 错误)

node.js - 是否可以在 ioredis 中使用 hget?

php - PhalconPHP 的 IDE 自动完成功能

php - 如何通过 PHP 设置文本框的值?

mysql - 找不到列 : execption in laravel

PHP 数据 URI 到文件