vuthaihoc / moox-jobs
在 Filament 中管理作业队列、失败的作业和批量作业。
Requires
- moox/core: *
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 切换回 Google 图标。
如果您需要可配置的内容,请向我们提交问题。
手动安装
此 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 让您在应用程序的 UI 中完全控制。但是,从 Laravel 作业队列开始需要一些准备。
第一个决定取决于您的托管和部署
Laravel Forge
Laravel Forge支持Redis、Horizon和Supervisor。最佳做法是安装Horizon并在Forge UI中启用它。然后你可以安排任何作业(或命令调度你的作业)。
如果你不需要更改代码(在kernel.php中)就可以安排任何命令,你可能可以考虑使用Filament Database Schedule插件。
更多信息
共享主机
在大多数共享主机和托管服务器上,Redis和Supervisor不可用。好处是:在共享主机上使用Moox Jobs将完美工作。使用数据库队列驱动,你将能够轻松监控和控制你的作业和批次。
你需要SSH访问权限来启动队列工作者,如下所示
php artisan queue:work
和Laravel Scheduler如下所示
php artisan schedule:work
自动化作业(并在失败后重新运行队列:worker)的最佳方式是创建一个crontab来运行Laravel Scheduler每分钟一次,并使用Filament Database Schedule插件来运行你的作业(或命令)。
更多信息
共享主机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的好方法是使用我们的
示例作业
你不需要更改你的作业以与Filament Job Monitor一起工作。但特别是对于长时间运行的作业,你可能会对这个示例感兴趣
<?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 特性的作业将在 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。
这将阻止导航项(s)被注册。
扩展性
虽然 Laravel 的队列系统和 Laravel Horizon 旨在跨多个服务器生成(尤其是批量生成),但 Moox Jobs 并未完全准备好此类使用。Moox Jobs 的核心优势是 Filament 集成以及管理在非 Redis 驱动程序上运行的作业的可能性,而不是管理企业级服务器农场。
除此之外,Moox Jobs 还测试过每小时管理数千个作业或每月管理数百万个作业。
限制
Moox Jobs 是数据库队列驱动程序的完美选择。它在共享托管上运行良好,并提供作业监控、挂起作业、失败作业以及重试失败作业的可能性,而其他 Laravel 扩展包(如 Horizon)则不适用。
作业监控和失败作业也支持 Redis、SQS 和 Beanstalkd,但它不会显示等待作业和作业批量。对于 Redis,我们建议使用 Laravel Horizon,对于 Amazon SQS,使用 AWS Dashboard。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
- 自动处理使用同步驱动运行的永不结束的作业
- 也许有简单的方式来支持等待的作业使用Redis?
用户体验
- 创建更友好的UI(图表、Apex?)和仪表板(监控器)
- 测试进度条
- 与其删除,不如取消作业,将其标记为已取消
- 区分失败(重试)和最终失败,或显示剩余重试次数(类似于尝试显示,但更明显)
- 改进批次(部分失败/非失败,查看作业是否属于批次,点击过滤批次的作业)
- 失败的作业资源不显示作业名称
- 添加筛选器并简化使用
- 配置用户体验,在导航中
通知
- 失败作业和每日统计的通知/可邮寄文件
Redis
- 改进对Redis的支持
- 将“软”依赖项添加到安装程序(Horizon或Predis?)
队列工作者和监督者
- 改进对队列工作者和监督者的支持
SQS
- 改进对亚马逊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 require的安装
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, Germany赞助。感谢您投资开源!
如果您使用此插件,请考虑进行小额捐赠以保持此项目的维护。特别是如果是一个商业项目,计算起来非常简单。为开发者构建优秀产品或为饥饿的开发者支付一点费用,或者产生错误或最糟糕的情况是放弃项目。是的,我们对我们钱包中的每一缕阳光都感到高兴;-)
许可协议
MIT许可(MIT)。请参阅许可文件以获取更多信息。
鸣谢
此FILAMENT插件深受启发(使用概念和/或代码)来自
两者均受MIT许可证保护。衷心感谢作者们!!!