sammyjo20 / laravel-haystack
Laravel 的超级工作链
v2.2.0
2024-05-14 17:52 UTC
Requires
- php: ^8.1
- illuminate/console: ^10.0 || ^11.7
- illuminate/contracts: ^10.0 || ^11.7
- illuminate/database: ^10.0 || ^v11.7
- illuminate/queue: ^10.0 || ^11.7
- illuminate/support: ^10.0 || ^11.7
- laravel/serializable-closure: ^1.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.5
- orchestra/testbench: ^8.0 || ^9.0
- pestphp/pest: ^v2.34
- pestphp/pest-plugin-laravel: ^1.2 || ^2.0
- sammyjo20/laravel-chunkable-jobs: ^1.1
- spatie/laravel-ray: ^1.26
Suggests
- sammyjo20/laravel-chunkable-jobs: Allows you to use the job chunking feature
This package is auto-updated.
Last update: 2024-09-14 18:53:19 UTC
README
注意:2024年5月14日
我将不再接受 Laravel Haystack 的新功能。我打算继续确保安全修复,但我认为项目现在已经完成。此外,我认为 Laravel 10+ 的工作批量和链更加强大,你可能在 2024 年不需要 Laravel Haystack。

Laravel Haystack
⚡️ Laravel 的超级工作链
Laravel Haystack 为 Laravel 提供了超级工作链。它具有强大的功能,例如延迟作业、为每个作业应用中间件、在作业之间共享数据和模型,甚至分批处理作业。Laravel Haystack 支持所有默认的队列连接/工作者。(数据库、Redis/Horizon、SQS)。如果你需要排队数千个作业,或者正在寻找原始 Bus 链不支持的功能,这将非常棒。
$haystack = Haystack::build() ->addJob(new RecordPodcast) ->addJob(new ProcessPodcast) ->addJob(new PublishPodcast) ->then(function () { // Haystack completed }) ->catch(function () { // Haystack failed }) ->finally(function () { // Always run either on success or fail. }) ->withMiddleware([ // Middleware for every job ]) ->withDelay(60) ->withModel($user) ->dispatch();
Laravel 已经有了工作链吗?
是的,Laravel 确实有工作链,但它们有一些缺点你可能需要考虑。
- 它们消耗相当多的内存/数据,因为链存储在作业中。如果你存储了数千个作业,这尤其如此。
- 它们是易变的,这意味着如果你在链中丢失一个作业,你将丢失整个链。
- 它们不提供批处理作业的
then
、catch
和finally
可调用方法。 - 基于内存或 SQS 队列的长时间延迟是不可行的,因为你可能会因过期或服务器关闭而丢失作业。
- 你无法在作业之间共享数据,因为没有“状态”贯穿整个链。
Laravel Haystack 通过将工作链存储在数据库中并一次排队一个作业来解决此问题。当作业完成时,Laravel Haystack 监听“作业完成”事件,并从数据库中排队链中的下一个作业。
Laravel Haystack 功能
- 低内存消耗,因为一次只处理一个作业,链存储在数据库中
- 你可以延迟/释放作业,直到你想的时间,因为它将使用调度器来重新启动链。即使你的队列驱动程序是 SQS!
- 它提供了类似于
then
、catch
和finally
的回调方法。 - 全局中间件,可以应用于链中的每个作业
- 你可以存储与链中每个作业共享的模型和数据。
- 你可以准备一个 Haystack 并在稍后调度它
用例
- 如果你需要连续进行数百或数千次 API 调用,可以与 Spatie 的 Job Rate Limiter 结合使用,以跟踪延迟并在达到速率限制时暂停作业。
- 如果你需要一次在链中排队数千个作业。
- 如果你需要批量导入数据行 - 每行都可以是一个 Haystack 作业(包),一次处理一行。同时将重要的作业信息存储在数据库中。
- 如果你使用 Amazon SQS,需要比 15 分钟更长的“释放”时间
安装
您可以使用 Composer 安装此包。**Laravel Haystack 需要 Laravel 8+ 和 PHP 8.1**
composer require sammyjo20/laravel-haystack
接下来,只需运行安装命令!
php artisan haystack:install
文档
支持 Haystack 的开发
虽然我从不期望得到任何东西,但如果你想支持我的工作,你可以通过在我的 Ko-Fi 页面上买一杯咖啡来捐赠!
感谢您使用Laravel Haystack ❤️