moox / jobs
在 Filament 中管理作业队列、失败作业和批次
Requires
- moox/core: ^2.1.0
README
Moox Jobs
管理 Filament 中的作业队列、失败作业和批次。
如果使用数据库驱动程序进行队列,则可以作为 Laravel Horizon 的替代方案。如果您使用 Redis,则它是 Laravel Horizon 的好插件。有关 Redis、Amazon SQS 和 Beanstalkd 兼容性的更多信息,请参阅下面的限制。有关 Laravel 作业队列以及 Moox Jobs 的工作原理的更多信息,请参阅我们的入门指南。
要求
Moox Jobs 需要
- PHP 8.1 或更高版本
- Laravel 10 或更高版本
- Filament 3 或更高版本
简而言之
composer create-project laravel/laravel moox-jobs-demo composer require filament/filament php artisan filament:install --panels php artisan make:filament-user
从 Moox Jobs V2 升级
Moox Jobs V3 需要更改数据库模式。我们为您提供了一个方便的更新命令
composer update php artisan mooxjobs:update
更新命令会处理更改和创建新字段,而不会丢失数据。或者,您可以删除 job-manager 表,然后简单地运行以下安装命令。
快速安装
这两个命令就是您安装包所需的所有内容
composer require moox/jobs php artisan mooxjobs:install
好奇安装命令的作用?请参阅下面的手动安装。
功能
作业
监控正在运行和已完成的作业。
等待作业
查看所有等待作业,删除一个、多个或甚至一次性删除所有等待作业,在它们进入队列之前。是的,我们不仅支持暗黑模式。
失败作业
查看所有失败作业,包括详细信息,重试或删除单个作业、多个作业或一次性删除所有失败作业。
作业批次
监控您的作业批次,修剪批次。
配置
包的配置正在开发中。为了使其更适合集成商,我们将很快增加更多灵活性和更好的翻译。
3.1 中的新功能是切换到 Google 图标,并能够在 将 Moox Core 中的图标切换回 Heroicons。
如果您需要可以配置的内容,请给我们发一个问题。
手动安装
此 Laravel 包是为 FilamentPHP 和出色的 TALL-Stack 制作的。如果您不想使用我们的安装命令,请按照以下手动步骤安装包。
通过 Composer 安装包
composer require moox/jobs
创建必要的表
php artisan vendor:publish --tag="jobs-manager-migration" php artisan vendor:publish --tag="jobs-batch-migration" php artisan vendor:publish --tag="jobs-queue-migration" php artisan vendor:publish --tag="jobs-manager-foreigns-migration" # Queue tables, if using the database driver # Not required for Redis, Amazon SQS or Beanstalkd php artisan queue:table php artisan queue:failed-table php artisan queue:batches-table php artisan migrate
使用以下命令发布配置文件
php artisan vendor:publish --tag="jobs-config"
这是发布配置文件的内容
return [ 'resources' => [ 'jobs' => [ 'enabled' => true, 'label' => 'Job', 'plural_label' => 'Jobs', 'navigation_group' => 'Job manager', 'navigation_icon' => 'heroicon-o-play', 'navigation_sort' => 1, 'navigation_count_badge' => true, 'resource' => Moox\Jobs\Resources\JobsResource::class, ], 'jobs_waiting' => [ 'enabled' => true, 'label' => 'Job waiting', 'plural_label' => 'Jobs waiting', 'navigation_group' => 'Job manager', 'navigation_icon' => 'heroicon-o-pause', 'navigation_sort' => 2, 'navigation_count_badge' => true, 'resource' => Moox\Jobs\Resources\JobsWaitingResource::class, ], 'failed_jobs' => [ 'enabled' => true, 'label' => 'Failed Job', 'plural_label' => 'Failed Jobs', 'navigation_group' => 'Job manager', 'navigation_icon' => 'heroicon-o-exclamation-triangle', 'navigation_sort' => 3, 'navigation_count_badge' => true, 'resource' => Moox\Jobs\Resources\JobsFailedResource::class, ], 'job_batches' => [ 'enabled' => true, 'label' => 'Job Batch', 'plural_label' => 'Job Batches', 'navigation_group' => 'Job manager', 'navigation_icon' => 'heroicon-o-inbox-stack', 'navigation_sort' => 4, 'navigation_count_badge' => true, 'resource' => Moox\Jobs\Resources\JobBatchesResource::class, ], ], 'pruning' => [ 'enabled' => true, 'retention_days' => 7, ], ];
在 app/Providers/Filament/AdminPanelProvider.php
中注册插件
->plugins([ \Moox\Jobs\JobsPlugin::make(), \Moox\Jobs\JobsWaitingPlugin::make(), \Moox\Jobs\JobsFailedPlugin::make(), \Moox\Jobs\JobsBatchesPlugin::make(), ])
您也可以像这样在 AdminPanelProvider 中完成所有设置
->plugins([ \Moox\Jobs\JobsPlugin::make() ->label('Job runs') ->pluralLabel('Jobs that seems to run') ->enableNavigation(true) ->navigationIcon('heroicon-o-face-smile') ->navigationGroup('My Jobs and Queues') ->navigationSort(5) ->navigationCountBadge(true) ->enablePruning(true) ->pruningRetention(7), \Moox\Jobs\JobsWaitingPlugin::make() ->label('Job waiting') ->pluralLabel('Jobs waiting in line') ->enableNavigation(true) ->navigationIcon('heroicon-o-calendar') ->navigationGroup('My Jobs and Queues') ->navigationSort(5) ->navigationCountBadge(true) \Moox\Jobs\JobsFailedPlugin::make() ->label('Job failed') ->pluralLabel('Jobs that failed hard') ->enableNavigation(true) ->navigationIcon('heroicon-o-face-frown') ->navigationGroup('My Jobs and Queues') ->navigationSort(5) ->navigationCountBadge(true) ])
您不需要注册所有资源。如果您不使用作业批次,可以通过不注册它来隐藏此功能。
作业入门指南
作业队列非常有用。每个需要超过几秒钟的任务都可以在后台处理,而 Moox Jobs 可以让您完全控制应用程序的用户界面。但是,要从 Laravel 作业队列开始需要一些准备。
第一个决定取决于您的托管和部署
Laravel Forge
Laravel Forge支持Redis、Horizon和Supervisor。最佳做法是安装Horizon并在Forge UI中启用它。然后您可以安排任何作业(或调度您的作业的命令)。
如果您想在无需更改代码(在kernel.php中)的情况下安排任何命令,您可以考虑使用Filament数据库调度插件。
更多信息
共享主机
在大多数共享主机和托管服务器上,Redis和Supervisor不可用。好事:在共享主机上使用Moox Jobs将完美工作。使用数据库队列驱动程序,您将能够轻松监控和控制您的作业和批处理。
您需要SSH访问权限以启动队列工作进程,如下所示
php artisan queue:work
以及Laravel Scheduler,如下所示
php artisan schedule:work
自动化作业(并在失败后重新运行队列:worker)的最佳方式是创建一个crontab来每分钟运行Laravel Scheduler,并使用Filament数据库调度插件运行您的作业(或命令)。
更多信息
共享主机API
Moox Core中的共享主机API允许从URL进行schedule/run
。在Moox Jobs中,我们使用此功能从URL执行queue:work
。
您可以在URL中添加一个可选的timeout
参数,以指定队列工作进程的超时时间(以秒为单位)。如果没有指定超时,则使用默认的超时时间60秒。
如果您想使用共享主机API,您需要将核心配置中的SHARED_HOSTING_ENABLED
设置为true
,并将SHARED_HOSTING_TOKEN
配置为安全令牌。
根服务器
在根服务器、VPS或云服务器Droplet上,最快的方式是像共享主机一样进行作业排队。但是,由于Redis与Supervisor的组合更加稳定,速度快出至少两倍,您还可以考虑使用root权限手动安装Redis和Supervisor,或者(根据您的提供商和部署方式,可能是Forge、Envoyer或Ploi.io)使用更方便的UI。
更多信息
Laravel Vapor
在Laravel Vapor上,这是无服务器(使用Amazon AWS Lambda服务)的第一方部署工具,Laravel将自动使用Amazon SQS(简单队列服务)作为队列驱动程序。Laravel SQS部分由Moox Jobs支持,这意味着您可以使用Moox Jobs监控作业和失败的作业、重试失败的作业并使用进度功能。当前尚未实现待处理作业和批处理。
更多信息
当您的作业队列启动并运行时,测试Moox Jobs的好方法是使用我们的
演示作业
您不需要更改您的作业中的任何内容即可与Filament作业监控一起工作。但对于长时间运行的作业,您可能会发现此示例很有趣
<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Moox\Jobs\Traits\JobProgress; class DemoJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, JobProgress, Queueable, SerializesModels; public $tries; public $timeout; public $maxExceptions; public $backoff; public function __construct() { $this->tries = 10; $this->timeout = 120; $this->maxExceptions = 3; $this->backoff = 240; } public function handle() { $count = 0; $steps = 10; $final = 100; while ($count < $final) { $this->setProgress($count); $count = $count + $steps; sleep(10); } } }
在app/Jobs/中创建一个名为DemoJob.php的文件,并将上面的内容复制过去。
自定义作业名称
默认情况下,任务的名称来自类的名称。这可以根据以下示例进行重写。
use Illuminate\Support\Carbon; ... public function displayName() { $now = Carbon::now(); return "Demo Job | Started: ".$now; }
演示作业命令
此示例命令将启动作业
<?php namespace App\Console\Commands; use App\Jobs\DemoJob; use Illuminate\Console\Command; class DemoJobCommand extends Command { protected $signature = 'moox:demojob'; protected $description = 'Start the Moox Demo Job'; public function __construct() { parent::__construct(); } public function handle() { $this->info('Starting Moox Demo Job'); DemoJob::dispatch(); $this->info('Moox Demo Job finished'); } }
在app/Console/Commands中创建一个名为DemoJobCommand.php的文件。然后执行
php artisan moox:demojob
以调度一个演示作业。
现在您可以在Filament UI中监控作业的进度。
进度
如上所述的演示作业所示,Moox Jobs自带进度功能。在您的作业中使用JobProgress特质是可选的。没有JobProgress-trait的作业将在Moox Jobs UI中运行并显示,只是缺少显示进度的舒适性。
如果您想使用进度功能,请记住
- 使用进度功能时,如果没有安装Moox Jobs,您的任务将无法运行。如果您的任务属于可安装的包,您应该考虑在您的包中要求使用Moox Jobs。
- 如果您想从您的应用程序中删除Moox Jobs,您必须在卸载Moox Jobs之前从您的任务中删除进度功能。
- 编写setProgress可能无法提供关于进度的确切信息。但对于长时间运行的任务来说,查看任务挂起(或仅仅长时间中断)的位置可能很有趣。在没有关于进度的粘合剂的情况下调试任务可能要困难得多。
模型
Moox Jobs的数据库模型是使用Vemto设计的
授权
我们使用Filament Shield而不是它,因此代码没有得到充分测试。如果您遇到困难,请留下反馈。
如果您想阻止某些用户访问您的页面,您可以注册策略
use App\Policies\JobMonitorPolicy; use Moox\Jobs\Models\FailedJob; use Moox\Jobs\Models\JobBatch; use Moox\Jobs\Models\JobMonitor; class AuthServiceProvider extends ServiceProvider { protected $policies = [ JobManager::class => JobManagerPolicy::class, FailedJob::class => FailedJobPolicy::class, JobBatch::class => JobBatchPolicy::class, ]; }
namespace App\Policies; use App\Models\User; use Illuminate\Auth\Access\HandlesAuthorization; class FailedJobPolicy { use HandlesAuthorization; public function viewAny(User $user): bool { return $user->can('manage_failed_jobs'); } }
同样适用于FailedJobPolicy和JobBatchPolicy。
这将阻止导航项被注册。
扩展性
虽然Laravels队列系统和Laravel Horizon是为跨多个服务器生成(特别是批量)而设计的,但Moox Jobs尚未完全准备好此类使用。Moox Jobs的核心优势是Filament集成和可以管理在非Redis驱动器上运行的作业的可能性,而不是管理企业级服务器农场。
除此之外,Moox Jobs已经过测试,每小时可以管理数千个作业或每月数百万个作业。
限制
Moox Jobs非常适合数据库队列驱动程序。它可以在共享主机上运行良好,并提供作业监控、待处理作业、失败作业以及重试失败作业的可能性,而其他Laravel包如Horizon则不适用。
作业监控和失败作业也适用于Redis、SQS和Beanstalkd,但它不显示等待作业和作业批量。对于Redis,我们建议使用Laravel Horizon,对于Amazon SQS,请使用AWS仪表板。Beanstalkd的解决方案似乎已经过时,但您可以尝试使用Laravel Beanstalkd Admin UI。
另一件事是使用Sync驱动器。由于Laravel中的Sync驱动器旨在用于开发和测试,因此它立即执行作业(同步)并且不利用队列。因此,它不使用failed_jobs、jobs或job_batches表。作业在同一个请求生命周期内立即执行,因此没有排队或存储作业。如果作业失败,它将在执行上下文中立即处理,而不是记录在failed_jobs表中。使用Sync驱动器运行的作业可能看起来像正在运行的作业,并且永远运行,即使它们已经完成或失败。
我们计划在将来扩展对所有队列驱动器的支持。请查看变更日志。
变更日志
有关最近更改的更多信息,请参阅CHANGELOG
路线图
由于Moox有许多部分(插件)需要开发,因此以下内容没有预期时间表...让我们称它们为想法。
稳定性
- 启用Moox Audit的日志记录,扩展demojob和其他内容
- 清理、修剪、拘留(以及相关的配置/文档)- https://github.com/croustibat/filament-jobs-monitor/commit/4616bb4b2f82d542cbbfe88d5143c9c43ec5196b
- 改进批量,请参阅https://laravel.net.cn/docs/10.x/queues#inspecting-batches和https://cosme.dev/post/how-to-handle-longrunning-jobs-in-laravel
- 自动处理使用Sync驱动器运行的永不结束的作业
- 也许有简单的方法来支持使用Redis等待的作业?
用户体验
- 创建一个更美观的UI(图表、Apex?)和仪表板(监控器)
- 测试进度条
- 取消作业比删除作业更好,将它们标记为已取消
- 区分失败(重试)和最终失败,或显示剩余重试次数(类似于尝试显示,但更明显)
- 改进批次(部分失败/非失败,查看作业是否属于批次,点击过滤批次的作业)
- 失败的作业资源不显示作业名称
- 添加过滤并简化使用方法
- 配置UX,在导航中
通知
- 失败作业的通知/邮件和每日统计
Redis
- 提高对Redis的支持
- 将"软依赖"添加到安装程序中(Horizon或Predis?)
队列工作器和监控器
- 提高对队列工作器和监控器的支持
SQS
- 提高对Amazon SQS的支持或文档
- 将"软依赖"添加到安装程序中(AWS SDK for PHP)
Beanstalkd
- 提高对Beanstalkd的支持或文档
API,调度器,CRON
- API
- 调度器(可能是一个附加插件)
- CRON(可能是一个附加插件)
贡献
我们欢迎每一个贡献!如果你能
- 在此仓库中创建一个包含有关问题或想法的问题。我们将在几天内回复。
- 在Monorepo中创建一个拉取请求。请勿向我们的只读仓库提交PR,它们尚未准备好代码更改。只有monorepo有质量门和自动测试。
- 使用Weblate翻译Moox。
- 告诉其他人关于Moox的信息或链接到我们。
- 考虑一个捐赠或赞助。
测试
Moox Jobs目前没有完全自动化的测试(除了Laravel Pint、PHPStan和Codacy作为质量门之外),但我们正在努力自动化测试。我们需要两种类型的测试
- 安装和更新命令
- 安装的应用程序本身
并且还有一些需要考虑的事情
- 是否已经安装了Filament?我们的安装程序包括Filament的自动安装。
- 是否有需要迁移的数据?我们的更新器迁移现有数据,并需要示例数据来完成此操作。
- 测试不同平台(Linux、Mac、Windows)、环境(Forge-Server、共享主机、本地开发)和队列驱动程序(Redis、数据库、同步、SQS、Beanstalkd)非常重要
测试安装
此安装运行在Forge、Vapor、共享主机、Mac和Windows上几个小时
composer create-project laravel/laravel moox-test cd moox-test mysqladmin -u root -p create moox-test composer require filament/filament php artisan filament:install --panels php artisan make:filament-user composer require moox/jobs php artisan mooxjobs:install mkdir monorepo cd monorepo git clone https://github.com/mooxphp/moox cp app/Jobs/* ../app/Jobs/ cp app/Console/Commands/* ../app/Console/Commands/ cp app/Console/kernel.php ../app/Console/kernel.php # final steps depend on the target system composer require laravel/horizon # Forge only php artisan queue:work php artisan schedule:work
测试更新
composer create-project laravel/laravel moox-test cd moox-test mysqladmin -u root -p create moox-test composer require filament/filament php artisan filament:install --panels php artisan make:filament-user composer require moox/jobs:2.0.9 php artisan mooxjobs:install mkdir monorepo cd monorepo git clone https://github.com/mooxphp/moox mysql -u root -p moox-test < database/sql/jobs/v2/failed_jobs.sql mysql -u root -p moox-test < database/sql/jobs/v2/job_batches.sql mysql -u root -p moox-test < database/sql/jobs/v2/job_manager.sql mysql -u root -p moox-test < database/sql/jobs/v2/jobs.sql cd .. composer require moox/jobs:3.0 composer update php artisan mooxjobs:update
带有Filament安装的测试安装
composer create-project laravel/laravel moox-test
cd moox-test
mysqladmin -u root -p create moox-test
composer require filament/filament
composer require moox/jobs
php artisan mooxjobs:install
带有Filament要求的测试安装
composer create-project laravel/laravel moox-test
cd moox-test
mysqladmin -u root -p create moox-test
composer require moox/jobs
php artisan mooxjobs:install
测试后清理
mysql -u root -p drop database moox-test
cd ..
rm -Rf moox-test
赞助商
Moox的初始开发得到了德国heco gmbh的赞助。非常感谢对开源的投资!
如果您使用此插件,请考虑进行小额捐赠以保持此项目的维护。特别是如果是商业项目,计算起来相当简单。为开发者构建优秀产品的几美元或饥饿的开发者,他们产生错误或最坏的情况——需要放弃项目。是的,我们对我们钱包中的每一缕阳光都感到高兴;-)
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。
致谢
此Filament插件深受以下项目的启发(使用概念和/或代码):
两者均在MIT许可证下。向作者致以诚挚的感谢!!!