【问题标题】:Laravel push lot of data to QueueLaravel 将大量数据推送到队列
【发布时间】:2020-10-22 21:21:52
【问题描述】:

我有一个模型,数据库中有大约 50 万条记录。我需要获取所有项目并将大约 50 万个作业推送到队列中。

我试过了:

Model::cursor()->each(function ($item) {
    dispatch(new Job($item));
});
// and
Model::chunk(10000, function ($items) {
    foreach ($items as $item) {
        dispatch(new Job($item));
    }
});

但是在这两种情况下我都遇到了内存泄漏,因为无论如何我都需要迭代所有 500k 记录并调用 dispatch() 方法。有没有将大量数据推送到 Laravel 队列的最佳方法?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    仅使用 id 可能适用于您的情况。试一试。

    调度

    Model::select('id')
          ->get()
          ->pluck('id')
          ->each(function ($id) {
              Job::dispatch($id);
          });
    

    工作

    class Job implements ShouldQueue
    {
        use Dispatchable, Queueable, InteractsWithQueue;
    
        protected $id;
    
        public function __construct($id)
        {
            $this->id = $id;
        }
    
        public function handle()
        {
            $item = Model::find($this->id);
            // do some stuff
        }
    }
    

    【讨论】:

    • 好多了,谢谢。但是我仍然有内存泄漏,我认为我应该将这个巨大的结果分成块并使用诸如作业批处理之类的东西......
    猜你喜欢
    • 2017-07-16
    • 2020-01-02
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 2019-07-03
    相关资源
    最近更新 更多