Laravel每5秒运行一次工匠命令

时间:2015-05-15 18:45:53

标签: php laravel cron

我正在使用一个系统,只要系统中的资源发生变化,就会向我发送webhooks。 webhook包含已更新资源的ID。例如,如果有人在此系统中编辑产品ID 1234,我的服务器将收到一条警告,说明产品1234已更改。然后我向他们的API请求获取产品1234的最新数据并将其保存到我的系统。

我正在构建此过程以异步工作。这意味着,每次收到webhook时,我都会将详细信息保存到记录资源ID的数据库表中。然后,我有一个WebhookQueue类,其中包含run()方法,该方法处理所有排队的请求并更新相应的产品。以下是WebhookQueue类的代码:

public static function run()
{
        //get request data
        $requests = WebhookRequest::select(
                        'webhook_type',
                        'object_ext_id',
                        'object_ext_type_id',
                        \DB::raw('max(created_at) as created_at')
                )
                ->groupBy(['webhook_type', 'object_ext_id', 'object_ext_type_id'])
                ->get();

        foreach ($requests as $request) {
                // Get the model for each request.
                // Make sure the model is not currently syncing.
                // Sync the model.
                // Delete all webhook request of the same type that were created before created_at on the request
                if ($request->webhook_type == 'product') {
                        $model = Product::where([
                                        'ext_id'=> $request->object_ext_id,
                                        'ext_type_id'=> $request->object_ext_type_id
                                ])->firstOrFail();

                        if (!$model->is_syncing) {
                                $model->syncWithExternal();

                                WebhookRequest::where([
                                        'webhook_type'=>$request->webhook_type,
                                        'object_ext_id'=>$request->object_ext_id,
                                        'object_ext_type_id'=>$request->object_ext_type_id,
                                ])
                                ->where('created_at', '<=', $request->created_at)
                                ->delete();
                        }
                }
        }
}

我还创建了一个命令,它只执行一行代码来处理队列。此命令为php artisan run-webhook-queue

我的计划是每隔5秒通过一个cron作业运行这个命令,但我刚刚得知cron作业不能比按分钟更细致地安排。

如何让这个命令每5秒运行一次,还是有其他方法我应该处理这种情况?我对Laravel Queues一无所知,但似乎我应该使用它。

1 个答案:

答案 0 :(得分:0)

Laravel Worker Queues处理得非常好,并且允许您每5秒运行一次命令。如果您使用Forge,安装几乎不需要任何工作。

以下是使用Forge的指南:https://mattstauffer.co/blog/laravel-forge-adding-a-queue-worker-with-beanstalkd

如果您不使用Forge,请参阅以下指南:http://fideloper.com/ubuntu-beanstalkd-and-laravel4