spatie / laravel-artisan-dispatchable
通过 Artisan 分发 Laravel 任务
Requires
- php: ^8.2
- illuminate/console: ^10.0|^11.0
- illuminate/contracts: ^10.0|^11.0
- spatie/laravel-package-tools: ^1.16.3
Requires (Dev)
- brianium/paratest: ^6.2|^7.4.3
- nunomaduro/collision: ^6.0|^7.10|^8.0
- orchestra/testbench: ^8.21.1|^9.0
- pestphp/pest: ^2.34.1
- spatie/laravel-ray: ^1.35.1
- spatie/pest-plugin-snapshots: ^2.1
- spatie/phpunit-snapshot-assertions: ^5.1.5
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 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)。有关更多信息,请参阅 许可证文件。