spatie/laravel-artisan-dispatchable

通过 Artisan 分发 Laravel 任务

1.5.0 2024-03-08 12:04 UTC

This package is auto-updated.

Last update: 2024-09-08 13:24:11 UTC


README

Latest Version on Packagist 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 spatie/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 命令名称是 job 的 base 名字,以 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

自定义命令描述

要将描述添加到工匠命令列表中,请将属性 $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 的作业以及它们的工匠命令应该是什么,通过遍历所有类并执行一些反射来实现。在本地环境中,这非常完美,因为性能影响不大,而且您不需要做任何特别的事情,只需让您的作业实现 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)。有关更多信息,请参阅 许可证文件