如何优化Laravel控制器以避免504?

时间:2019-11-16 02:21:35

标签: php laravel

我正尝试将约3,000个项目推入表中-我不确定是否可行,但我觉得我的控制器可以通过一些优化达到这一水平。当前需要60秒钟以上的时间才能超时。

super(props)

1 个答案:

答案 0 :(得分:0)

您有一些选择。第一件事是您不需要循环运行这些查询。您知道要查找的所有items,因此可以同时查询3个表中的所有项目(3个独立查询中的UNION)。然后,您可以获得原始items列表与数据库中存在的列表之间的区别:

if ($request->has('items')) {
    $items = (array) $request->input('items');

    $exists = QueueItem::whereIn('item', $items)
        ->select('item')
        ->union(QueueItemFailed::whereIn('item', $items)->select('item'))
        ->union(CacheItem::whereIn('item', $items)->select('item'))
        ->pluck('item');

    // get the difference between the input items and the existing items
    $insert = collect($items)->diff($exists)->transform(function ($item) {
        return ['item' => $item];
    })->toArray();

    QueueItem::insert($insert);

    return response()->json([
        'success' => true,
    ], 200);
}

Laravel 6.x Docs - Query Builder - Unions union

Laravel 6.x Docs - Query Builder - Retrieving Results - Retrieving A List Of Column Values pluck

Laravel 6.x Docs - Collections - Available Methods - diff

Laravel 6.x Docs - Collections - Available Methods - transform

如果遇到某个参数限制或类似的限制,可以对$items进行分块,也可以对$inserts进行分块以进行插入。

Laravel 6.x Docs - Collections - Available Methods - chunk