yiisoft/yii2-queue

Yii2 队列扩展,支持 DB, Redis, RabbitMQ, Beanstalk 和 Gearman

Yii2 队列

通过队列异步运行任务的扩展。

它支持基于DBRedisRabbitMQAMQPBeans.Gearman的队列。文档地址.

安装

安装扩展的最佳实践是通过 composer.

运行

php composer.phar require --prefer-dist yiisoft/yii2-queue

或者添加

"yiisoft/yii2-queue": "~2.0"

到你的 composer.json 文件。

基本用法

发送到队列的每个任务都应该被定义为一个单独的类。

例如,如果需要下载和保存文件,该类可能如下所示:

class DownloadJob extends BaseObject implements \yii\queue\JobInterface
{
    public $url;
    public $file;

    public function execute($queue)
    {
        file_put_contents($this->file, file_get_contents($this->url));
    }
}

下面是如何将任务发送到队列中:

Yii::$app->queue->push(new DownloadJob([
    'url' => 'http://example.com/image.jpg',
    'file' => '/tmp/image.jpg',
]));

将作业推到5分钟后运行的队列中:

Yii::$app->queue->delay(5 * 60)->push(new DownloadJob([
    'url' => 'http://example.com/image.jpg',
    'file' => '/tmp/image.jpg',
]));

执行任务的确切方式取决于所使用的驱动程序。大多数驱动程序都可以使用控制台命令,组件自动在应用程序中注册这些命令。

此命令在循环中获得并执行任务,直到队列为空:

yii queue/run

这个命令启动一个守护进程,它无限地查询队列:

yii queue/listen

有关驱动程序特定控制台命令及其选项的更多详细信息,请参阅文档。

组件还可以跟踪推入队列的作业的状态。

// 将任务推到队列中并获取消息ID。
$id = Yii::$app->queue->push(new SomeJob());

// 检查作业是否在等待执行。
Yii::$app->queue->isWaiting($id);

// 检查一个 worker 是否从队列中得到该作业并执行它。
Yii::$app->queue->isReserved($id);

// 检查 worker 是否执行了作业。
Yii::$app->queue->isDone($id);

详情请见 the guide.