yiisoft/yii2-queue
Yii2 Queue runs tasks asynchronously via pluggable queue backends: DB, Redis, RabbitMQ/AMQP, Beanstalk, ActiveMQ, and Gearman. Define jobs as classes implementing JobInterface and push them to the queue for background processing.
Installation
composer require yiisoft/yii2-queue
Add to your config/web.php or config/console.php:
'components' => [
'queue' => [
'class' => 'yiisoft\queue\Queue',
'connections' => [
'db' => [
'class' => 'yiisoft\queue\db\Queue',
'tableName' => '{{%queue_job}}',
],
],
],
],
Create a Job
php yii queue/create-job SendWelcomeEmail
This generates a job class in jobs/SendWelcomeEmail.php:
namespace app\jobs;
use yii\queue\JobInterface;
class SendWelcomeEmail implements JobInterface {
public $userId;
public function execute($queue, $data) {
// Logic to send email
}
}
Run a Worker
php yii queue/run db --queue=default --delay=1
Dispatch a job immediately:
Yii::$app->queue->push(new SendWelcomeEmail(['userId' => 123]));
Delayed Jobs
Yii::$app->queue->push(new SendWelcomeEmail(['userId' => 123]))
->delay(3600); // Delay for 1 hour
Retry Logic
Yii::$app->queue->push(new SendWelcomeEmail(['userId' => 123]))
->retry(3, 60); // Retry 3 times, every 60 seconds
Queue-Specific Dispatching
Yii::$app->queue->push(new SendWelcomeEmail(['userId' => 123]))
->queue('high_priority');
tableName is properly configured.'redis' => [
'class' => 'yiisoft\queue\redis\Queue',
'dsn' => 'redis://localhost:6379',
],
'rabbitmq' => [
'class' => 'yiisoft\queue\rabbitmq\Queue',
'dsn' => 'amqp://guest:guest@localhost:5672',
],
Yii::$app->queue->push(new ProcessOrder(['orderId' => 1]))
->then(new SendOrderConfirmation(['orderId' => 1]));
php yii queue/run db --daemon --queue=default
--log-level=debug for detailed logs or integrate with yii\monolog\Target\FileTarget for persistent logging.FOR UPDATE locks. Long-running jobs may block other jobs. Avoid heavy operations in jobs.yiisoft\queue\ConnectionEvent to handle disconnections.Yii::$app->queue->push(new LongRunningJob())->timeout(300); // 5 minutes
failed_jobs table (DB) or Redis keys for stuck jobs. Manually delete or retry:
php yii queue/retry-all db --queue=default
--log-level=debug to diagnose.yiisoft\queue\JobEvent listener to log failures:
Yii::$app->queue->on(JobEvent::EVENT_FAILED, function ($event) {
Yii::error("Job failed: " . $event->job->getClass());
});
tableName config. Run migrations if needed.queue_). Customize with:
'redis' => [
'prefix' => 'custom_queue_',
],
'rabbitmq' => [
'exchange' => 'my_exchange',
'exchangeType' => 'direct',
],
yiisoft\queue\Job for shared functionality:
class BaseJob extends \yiisoft\queue\Job {
public function getRetryDelay() {
return 60; // Default retry delay
}
}
Yii::$app->queue->push(new MyJob())->middleware([
new \yiisoft\queue\middleware\Retry(),
new \app\middleware\LogJobExecution(),
]);
Yii::$app->queue->on(QueueEvent::EVENT_BEFORE_PUSH, function ($event) {
// Pre-process job data
});
How can I help you explore Laravel packages today?