nguyenhiep / laravel-artisan-dispatchable
通过 Artisan 分发 Laravel 任务
Requires
- php: >=7.4
- spatie/laravel-package-tools: ^1.4.3
- spatie/phpunit-snapshot-assertions: ^4.2
Requires (Dev)
- brianium/paratest: ^6.2
- nunomaduro/collision: ^5.3
- orchestra/testbench: ^6.15
- phpunit/phpunit: ^9.3
- spatie/laravel-ray: ^1.9
README
此包可以将任务注册为 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)。请参阅 许可证文件 了解更多信息。