adrolli / filament-job-manager
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
更新命令会处理更改和创建新字段,而不会丢失数据。或者,您也可以删除作业管理器表,然后简单地运行以下安装命令。
快速安装
安装此包只需要这两个命令
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 为您的应用程序 UI 提供了完全的控制。但是,从 Laravel 工作队列开始需要一些准备。
第一个决定取决于您的托管和部署
Laravel Forge
Laravel Forge 支持 Redis、Horizon 和 Supervisor。最好的方法是安装 Horizon 并在 Forge UI 中启用它。然后您可以为任何作业(或派发作业的命令)进行调度。
要调度任何命令而无需更改代码(在 kernel.php 中),您可以考虑使用 Filament 数据库调度插件。
更多信息
共享主机
在大多数共享主机和管理服务器上,Redis 和 Supervisor 都不可用。好消息是,使用 Moox Jobs 在共享主机上将完美工作。使用数据库队列驱动程序,您将能够轻松地监控和控制您的作业和批次。
您需要 SSH 访问才能启动队列工作者,如下所示
php artisan queue:work
以及 Laravel 调度器,如下所示
php artisan schedule:work
自动处理作业(并处理队列工作者失败后的重新运行)的最佳方式是创建一个 crontab,每分钟运行一次 Laravel 调度器,并使用 Filament 数据库调度插件来运行作业(或命令)。
更多信息
共享主机 API
Moox 核心中的共享主机 API 允许从 URL 进行 schedule/run
。在 Moox Jobs 中,我们使用此功能从 URL 执行 queue:work
。
您可以将可选的 timeout
参数添加到 URL,以指定队列工作者的秒数超时。如果没有指定超时,则使用默认的超时时间 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 作业监控器一起使用。但对于长时间运行的作业,您可能会发现此示例很有趣
<?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。
这将阻止导航项被注册。
扩展
虽然Laravel的队列系统和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有许多需要开发的组件(插件),因此以下...我们称之为想法的ETA尚不明确。
稳定性
- 使用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的赞助。感谢您对开源的投资!
如果您使用此插件,请考虑小额捐赠以保持此项目的维护。特别是如果是一个商业项目,这很容易计算。为开发者建造伟大产品或饥饿的开发者生产错误或最坏的情况需要放弃项目。是的,我们对我们钱包里的小阳光感到很高兴;-)
许可证
MIT许可证(MIT)。更多信息请参阅许可证文件。
致谢
本Filament插件深受以下项目启发(使用概念和/或代码):
两者均在MIT许可证下。衷心感谢作者的贡献!!!