pdffiller/laravel-queue-qless

v1.8.2 2021-11-18 08:49 UTC

README

安装

您可以通过以下命令使用composer安装此包:

composer require pdffiller/laravel-queue-qless

该包将自动使用Laravel自动发现注册自己。

config/queue.php 中设置连接

    'connections' => [
        // ...
        'qless' => [
            'driver' => 'qless',
            'redis_connection' => 'qless',
            'queue' => 'default',
        ],
        // ...    
    ],

您还可以在 config/queue.php 中将Qless队列设置为默认队列

    'default' => env('QUEUE_DRIVER', 'qless'),

config/database.php 中设置Redis连接

    'redis' => [

        'client' => 'predis',

        // ...
        'qless' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],
        // ...
    ],

并将Laravel Qless服务提供者添加到app.php

<?php

return [
    //...
    'providers' => [
        //...
        /**
         * Qless
         */
         LaravelQless\LaravelQlessServiceProvider::class,
    ]
];

用法

一旦您完成配置,您就可以使用Laravel队列API。如果您使用过其他队列驱动程序,您无需更改其他任何内容。如果您不知道如何使用队列API,请参阅官方Laravel文档:https://laravel.net.cn/docs/queues

您还可以使用其他功能。

主题

主题可以帮助您将作业放入不同的队列。首先,您必须创建一个订阅。您可以为主题名称使用模式。符号 * - 单词,# - 由点 . 分隔的几个单词。示例:first.second.**.second.*#.third

/**
 * Subscribe
 */

\Queue::subscribe('*.*.test', 'queue1');

\Queue::subscribe('this.*.test', 'queue2');

\Queue::subscribe('this.*.orange', 'queue3');

然后您可以将作业放入所有订阅者。

/**
 * Put job to few queues
 */
\Queue::pushToTopic('this.is.test', TestQless::class, ['test' => 'test']);
// Push job to queue1 and queue2, but not to queue3

自定义处理程序

作业处理程序可以帮助您为作业创建自定义路由。

自定义处理程序示例

    class CustomHandler implements JobHandler
    {
        public function perform(BaseJob $job): void
        {
            if ($job->getQueue() === 'queue_name') { // by queue
                (new QueueNameJob)->perform($job);
                return;
            }
            
            if ($job->getData()['option_name'] === 'value') { // by payload
                (new OptionNameJob)->perform($job);
                return;
            }
            
            if (in_array('tag_name', $job->getTags())) { // by tag
                (new TagNameJob)->perform($job);
                return;
            }
            
            // other
            
            $job->perform(); // Default
        }
    }
    

您必须将其添加到服务提供者中。

    public function boot()
    {
        // other code

        $this->app->bind(JobHandler::class, CustomHandler::class);
        
        // other code
    }

周期性作业

有时仅仅调度一个作业是不够的,但您希望定期运行作业。特别是,您可能有一些需要每小时运行一次的批量操作,而您不在乎哪个工作进程运行它。周期性作业的指定方式与其他作业类似

/**
 * Recurring Job
 */
 
\Queue::recur($intervalInSeconds, $jobClass, $data, $queueName); 

分片

如果您将Qless分片与数据库分片进行比较,那么它们几乎没有共同之处。Qless为所有作业获取随机的写入连接。数据读取发生在所有连接的循环中。

config/database.php 中设置分片Redis连接

return [
    'redis' => [
        // ...
        'qless' => [ /* ... */ ],
        'connection2' => [ /* ... */ ],
        'connection3' => [ /* ... */ ],
        // ...
    ],
];

然后在 config/queue.php 文件中的 redis_connection 键中设置碎片

return [
    'connections' => [
        // ...
        'qless' => [
            // ...
            'redis_connection' => [
                'connection2',
                'connection3',
            ],
            // ...
        ],
        // ...
    ],
];

测试

您可以使用以下命令运行测试:

vendor/bin/phpunit

贡献

您可以通过发现错误和打开问题来为此包做出贡献。请添加您创建的拉取请求或问题的包版本。(例如:[1.2] 在推送作业时发生致命错误)

许可协议

Laravel Qless队列驱动程序是开源软件,许可证为MIT。有关更多信息,请参阅 LICENSE.txt 文件。

© 2018-2019 PDFfiller

版权所有。