发送响应但保留长 运行 脚本以防止超时?
Send response but keep long running script going to prevent timeout?
我想知道如何处理这个问题。我有一个 Webhook 端点,它响应来自 Github.
的 Webhook 调用
它开始一个漫长的 运行 过程,在该过程中它克隆从中进行 webhook 调用的存储库。
/**
* The webhook endpoint.
*
* @param Request $request
* @return mixed
* @throws \Exception
*/
public function webhook(Request $request)
{
// The type of GitHub event that we receive.
$event = $request->header('X-GitHub-Event');
$url = $this->createCloneUrl();
$this->cloneGitRepo($url);
return new Response('Webhook received succesfully', 200);
}
这个问题是 Github 在没有足够快地提供响应时给出错误。
We couldn’t deliver this payload: Service Timeout
这是理所当然的,因为我的 cloneGitRepo
方法只是阻止了响应的执行,而且花费的时间太长。
我怎样才能仍然发送响应以确认 Github webhook 调用已成功进行并开始我漫长的 运行 过程?
我正在使用 Laravel 通过 Redis 完成所有这些,也许可以在那里完成一些事情?我愿意接受所有建议。
您要找的是一份排队的工作。 Laravel 使用 Laravel Queues.
使这变得非常容易
对于队列,您可以设置一个队列驱动程序(数据库、redis、Amazon SQS 等),然后您拥有一对多连续 运行ning 的队列工作者。当您通过 webhook
方法将作业放入队列时,它会被您的队列工作人员之一和 运行 在单独的进程中拾取。不过,将排队的作业分派到队列的动作非常快,因此您的 webhook
方法将 return 快速执行,而真正的工作是由队列工作者完成的。
链接文档包含所有详细信息,但一般过程为:
设置队列连接。你提到你已经在使用redis,我会从那个开始。
使用 php artisan make:job CloneGitRepo
创建一个 CloneGitRepo
工作 class。
它应该实现 Illuminate\Contracts\Queue\ShouldQueue
接口,以便 Laravel 知道在调度时将此作业发送到队列。
确保在 class 上为传递给构造函数的任何数据定义属性。这是必要的,这样工作人员可以在从队列中拉出作业时正确地重建作业。
队列工作者将调用handle()
方法来处理作业。任何依赖项都可以在此处进行类型提示,它们将从 IoC 容器中注入。
要将作业分派到队列,您可以使用全局 dispatch()
辅助函数,或调用作业本身的静态 dispatch()
方法。
dispatch(new CloneGitRepo($url));
CloneGitRepo::dispatch($url);
因此,您的 webhook 将如下所示:
public function webhook(Request $request)
{
// The type of GitHub event that we receive.
$event = $request->header('X-GitHub-Event');
$url = $this->createCloneUrl();
CloneGitRepo::dispatch($url);
return new Response('Webhook received succesfully', 200);
}
我想知道如何处理这个问题。我有一个 Webhook 端点,它响应来自 Github.
的 Webhook 调用它开始一个漫长的 运行 过程,在该过程中它克隆从中进行 webhook 调用的存储库。
/**
* The webhook endpoint.
*
* @param Request $request
* @return mixed
* @throws \Exception
*/
public function webhook(Request $request)
{
// The type of GitHub event that we receive.
$event = $request->header('X-GitHub-Event');
$url = $this->createCloneUrl();
$this->cloneGitRepo($url);
return new Response('Webhook received succesfully', 200);
}
这个问题是 Github 在没有足够快地提供响应时给出错误。
We couldn’t deliver this payload: Service Timeout
这是理所当然的,因为我的 cloneGitRepo
方法只是阻止了响应的执行,而且花费的时间太长。
我怎样才能仍然发送响应以确认 Github webhook 调用已成功进行并开始我漫长的 运行 过程?
我正在使用 Laravel 通过 Redis 完成所有这些,也许可以在那里完成一些事情?我愿意接受所有建议。
您要找的是一份排队的工作。 Laravel 使用 Laravel Queues.
使这变得非常容易对于队列,您可以设置一个队列驱动程序(数据库、redis、Amazon SQS 等),然后您拥有一对多连续 运行ning 的队列工作者。当您通过 webhook
方法将作业放入队列时,它会被您的队列工作人员之一和 运行 在单独的进程中拾取。不过,将排队的作业分派到队列的动作非常快,因此您的 webhook
方法将 return 快速执行,而真正的工作是由队列工作者完成的。
链接文档包含所有详细信息,但一般过程为:
设置队列连接。你提到你已经在使用redis,我会从那个开始。
使用
php artisan make:job CloneGitRepo
创建一个CloneGitRepo
工作 class。它应该实现
Illuminate\Contracts\Queue\ShouldQueue
接口,以便 Laravel 知道在调度时将此作业发送到队列。确保在 class 上为传递给构造函数的任何数据定义属性。这是必要的,这样工作人员可以在从队列中拉出作业时正确地重建作业。
队列工作者将调用
handle()
方法来处理作业。任何依赖项都可以在此处进行类型提示,它们将从 IoC 容器中注入。
要将作业分派到队列,您可以使用全局
dispatch()
辅助函数,或调用作业本身的静态dispatch()
方法。dispatch(new CloneGitRepo($url));
CloneGitRepo::dispatch($url);
因此,您的 webhook 将如下所示:
public function webhook(Request $request)
{
// The type of GitHub event that we receive.
$event = $request->header('X-GitHub-Event');
$url = $this->createCloneUrl();
CloneGitRepo::dispatch($url);
return new Response('Webhook received succesfully', 200);
}