nguyenhiep/laravel-artisan-dispatchable

通过 Artisan 分发 Laravel 任务

v1.2.3.2 2021-07-02 09:36 UTC

This package is auto-updated.

Last update: 2024-09-29 06:03:05 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

此包可以将任务注册为 Artisan 命令。您只需要让您的任务实现空的 ArtisanDispatchable 接口。

use Illuminate\Contracts\Queue\ShouldQueue;
use Spatie\ArtisanDispatchable\Jobs\ArtisanDispatchable;

class ProcessPodcast implements ShouldQueue, ArtisanDispatchable
{
    public function handle()
    {
        // perform some work...
    }
}

这允许任务通过 Artisan 执行。

php artisan process-podcast

我们创建此包的原因

Laravel 的调度器 将按顺序执行所有任务。当您将计划任务添加到调度器时,任务应尽可能快地完成其工作,以便没有其他任务需要等待。

如果您有一个需要每分钟运行的任务,并且其运行时间接近一分钟,您不应使用简单的 Artisan 命令,因为这会导致所有其他分钟任务的延迟。

长时间运行的任务应由在队列上执行其工作的作业执行。Laravel 有 安排队列作业的能力。这样,那些任务就不会阻塞调度器。

$schedule->job(new ProcessPodcast)->everyFiveMinutes();

这种方法的缺点是您不能再通过 Artisan 运行该作业了。您必须在使用 artisan 命令 + 阻塞调度器的一方和作业 + 不阻塞调度器的一方之间做出选择。

使用我们的包,您不再需要做出这种选择。当让您的作业实现 Spatie\ArtisanDispatchable\Jobs\ArtisanDispatchable 时,您不会阻塞调度器,并且仍然可以通过 Artisan 执行逻辑。

支持我们

我们投入了大量资源来创建 一流的开放式源代码包。您可以通过 购买我们的付费产品之一 来支持我们。

我们非常感谢您从您的家乡寄给我们明信片,并说明您正在使用我们的哪些包。您可以在 我们的联系页面 上找到我们的地址。我们将所有收到的明信片发布在我们的 虚拟明信片墙上

安装

您可以通过 composer 安装此包

composer require nguyenhiep/laravel-artisan-dispatchable

可选地,您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="Spatie\ArtisanDispatchable\ArtisanDispatchableServiceProvider" --tag="artisan-dispatchable-config"

这是发布配置文件的内容

return [
    /*
     * These directories will be scanned for dispatchable jobs. They
     * will be registered automatically to Artisan.
     */
    'auto_discover_dispatchable_jobs' => [
        app()->path(),
    ],

    /*
     * This directory will be used as the base path when scanning
     * for dispatchable jobs.
     */
    'auto_discover_base_path' => base_path(),

    /*
     * In production, you likely don't want the package to auto-discover dispatchable
     * jobs every time Artisan is invoked. The package can cache discovered job.
     *
     * Here you can specify where the cache should be stored.
     */
    'cache_file' => storage_path('app/artisan-dispatchable/artisan-dispatchable-jobs.php'),

    /**
     * Here you can specify the prefix to be used for all dispatchable jobs.
     */
    'command_name_prefix' => '',
];

用法

您只需让您的作业实现空的 ArtisanDispatchable 接口。

use Illuminate\Contracts\Queue\ShouldQueue;
use Spatie\ArtisanDispatchable\Jobs\ArtisanDispatchable;

class ProcessPodcast implements ShouldQueue, ArtisanDispatchable
{
    public function handle()
    {
        // perform some work...
    }
}

这允许任务通过 Artisan 执行。

php artisan process-podcast

此作业将不会被队列,而是在执行的 artisan 命令内立即执行。

通过 Artisan 队列作业

如果您想将您的作业放入队列而不是立即执行,请添加 queued 选项。

php artisan process-podcast --queued

将参数传递给作业

如果您的作业有构造函数参数,您可以通过 artisan 命令的选项传递这些参数。

use Illuminate\Contracts\Queue\ShouldQueue;
use Spatie\ArtisanDispatchable\Jobs\ArtisanDispatchable;


class ProcessPodcast implements ShouldQueue, ArtisanDispatchable
{
    public function __construct(
        string $myFirstArgument, 
    ) {}

    public function handle()
    {
        // perform some work...
    }
}

通过 artisan,您可以像这样调用作业

php artisan process-podcast --my-first-argument="My string value"

使用 Eloquent 模型作为参数

如果您的作业参数是一个 Eloquent 模型,您可以通过 artisan 命令选项传递该模型的 ID。

use App\Models\Podcast;
use Illuminate\Contracts\Queue\ShouldQueue;
use Spatie\ArtisanDispatchable\Jobs\ArtisanDispatchable;

class ProcessPodcast implements ShouldQueue, ArtisanDispatchable
{
    public function __construct(
        Podcast $podcast, 
    ) {}

    public function handle()
    {
        // perform some work...
    }
}

以下是您如何使用播客 ID 1234 执行此作业的示例

php artisan process-podcast --podcast="1234"

自定义命令名称

默认情况下,作业的 artisan 命令名称是作业的基本名称,以短横线连接的 kebab-case。

您可以通过在作业上设置名为 artisanName 的属性来自定义名称。

use Illuminate\Contracts\Queue\ShouldQueue;
use Spatie\ArtisanDispatchable\Jobs\ArtisanDispatchable;

class ProcessPodcast implements ShouldQueue, ArtisanDispatchable
{
     public string $artisanName = 'my-app:process-my-podcast';

    public function handle()
    {
        // perform some work...
    }
}

现在可以使用此命令执行此作业

php artisan my-app:process-my-podcast

自定义命令描述

要将描述添加到 artisan 命令列表中,请在您的作业中添加一个名为 $artisanDescription 的属性。

use Illuminate\Contracts\Queue\ShouldQueue;
use Spatie\ArtisanDispatchable\Jobs\ArtisanDispatchable;

class ProcessPodcast implements ShouldQueue, ArtisanDispatchable
{
    public string $artisanDescription = 'This a custom description';

    public function handle()
    {
        // perform some work...
    }
}

所有命令的前缀

您可以在配置文件中的 command_name_prefix 键中指定一个前缀。如果将其设置为 my-custom-prefix,则可以使用此命令调用 MyDispatchableJob

php artisan my-custom-prefix:process-my-podcast

缓存发现的作业

此包可以自动发现实现了 ArtisanDispatchable 的作业以及它们的 artisan 命令,通过遍历所有类并执行一些反射来完成。在本地环境中,这是完美的,因为性能影响不大,而且您不需要做任何特别的事情,只需让您的作业实现 ArtisanDispatchable 即可。

在生产环境中,您可能不希望在每次请求时都遍历所有类。该包包含一个命令来缓存所有发现的作业。

php artisan artisan-dispatchable:cache-artisan-dispatchable-jobs

您可能希望在部署应用程序时调用该命令。这将创建一个缓存文件,该文件位于 artisan-dispatchable 配置文件中的 cache_file 键指定的位置。

如果您想清除缓存,可以执行此命令

php artisan artisan-dispatchable:clear-artisan-dispatchable-jobs

测试

composer test

变更日志

请参阅 变更日志 了解最近发生了哪些变化。

贡献

请参阅 贡献指南 了解详细信息。

安全漏洞

请审查 我们的安全策略 了解如何报告安全漏洞。

鸣谢

许可证

MIT 许可证 (MIT)。请参阅 许可证文件 了解更多信息。