raicem/laravel-defer-jobs

将任务延迟执行,在发送响应后执行。无需队列系统。

1.0.2 2019-06-18 09:51 UTC

This package is auto-updated.

Last update: 2024-09-18 22:21:59 UTC


README

将任务延迟执行,在发送响应后执行*。无需队列系统。

*仅当您使用 php-fpm 时。请参阅要求部分获取更多信息。

为什么

有时您不想只为了在请求和响应周期之外进行一些轻微的工作而设置队列系统。这个包旨在证明可以在不使用队列系统的情况下从请求和响应周期中提取一些工作。请注意,这更多的是一个概念证明,我相信可以有更健壮的实现。

如何

php-fpm 暴露了一个名为 fastcgi_finish_request 的函数,该函数被 Laravel 用于将请求发送到 web 服务器。

Laravel 在中间件中公开了一个名为 terminate 的方法,允许在调用 fastcgi_finish_request 函数之后进行一些工作。这个包基本上就是一个收集要延迟的任务并在 terminate 函数中运行的 中间件 的服务。

安装

使用 composer 安装包

composer require raicem/laravel-defer-jobs

此包支持 自动发现。因此,服务提供者应自动注册。

您必须手动注册中间件。您可以在 app/Http/Kernel.php 文件中注册它。

// app/Http/Kernel.php
 protected $middleware = [
     //..
    \App\Http\Middleware\TrustProxies::class,
    \Raicem\Defer\Middleware\ExecuteDeferredJobs::class,
];

然后您就可以开始了。

使用

此包利用 Laravel 的任务实现。任务是发送到 队列系统 的对象。

首先,您可以 创建一个任务

php artisan make:job LogSomething

在您的任务类中实现 Deferrable 特性。

use Raicem\Defer\Deferrable;

class LogSomething implements ShouldQueue
{
    use Deferrable, SerializesModels;

    private $message;
    
    public function __construct(string $message)
    {
        $this->message = $message;
    }

    public function handle()
    {
        // handle job
    }
}

现在您可以在任何您想的地方调用任务。例如,在您的控制器中。

// HomeController.php

use App\Jobs\LogSomething;

class HomeController 
{
    public function action()
    {
        // do stuff
        LogSomething::defer('my log message');

        return view('welcome');
    }
}

您的任务将在发送响应后执行。

请注意,此包与队列系统没有任何关系。您仍然可以创建一个任务并将其发送到适当的 队列系统

使用任务对象将允许您稍后切换实现。如果您不再想延迟任务而想将它们发送到队列系统,这非常简单。

用例

  • 发送电子邮件
  • 记录
  • 从请求或响应收集分析数据
  • 进行 API 调用

基本上,一些可能会减慢响应时间的轻微工作。

要求

只有当您使用 php-fpm 来执行代码时,此包才会产生效果。如果您不使用 php-fpm 而尝试使用它,则它将没有任何效果,并且它将在发送响应之前运行任务。

警告

请注意,如果您想使用此方法执行大量工作,则此包不适合您。 php-fpm 将保持进程打开,直到脚本结束。这样做可能会导致您达到 php-fpm 的子进程最大限制。如果您达到该限制,您可能无法接收任何新的请求。