Manual Configuration (without yiisoft/config)
This guide explains how to set up the queue component manually, without using yiisoft/config.
To use the queue, you need to create instances of the following classes:
- Adapter - handles the actual queue backend like AMQP, Redis, etc.
- Worker - processes messages from the queue
- Queue - the main entry point for pushing messages
use Psr\Container\ContainerInterface;
use Psr\Log\NullLogger;
use Yiisoft\Injector\Injector;
use Yiisoft\Queue\Cli\SimpleLoop;
use Yiisoft\Queue\Middleware\CallableFactory;
use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareDispatcher;
use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareFactory;
use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareDispatcher;
use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareFactory;
use Yiisoft\Queue\Middleware\Push\PushMiddlewareConfig;
use Yiisoft\Queue\Middleware\Push\PushMiddlewareFactory;
use Yiisoft\Queue\Queue;
use Yiisoft\Queue\Worker\Worker;
// A PSR-11 container is required for resolving dependencies of middleware and handlers.
// How you build it is up to you.
/** @var ContainerInterface $container */
$logger = new NullLogger(); // replace with your PSR-3 logger in production
// Define message handlers
$handlers = [
DownloadFileMessage::TYPE => [FileDownloader::class, 'handle'],
];
$callableFactory = new CallableFactory($container);
// Create middleware dispatchers
$consumeMiddlewareDispatcher = new ConsumeMiddlewareDispatcher(
new ConsumeMiddlewareFactory($container, $callableFactory),
);
$failureMiddlewareDispatcher = new FailureMiddlewareDispatcher(
new FailureMiddlewareFactory($container, $callableFactory),
[],
);
$pushMiddlewareConfig = new PushMiddlewareConfig(
new PushMiddlewareFactory($container, $callableFactory),
);
// Create worker
$worker = new Worker(
$handlers,
$logger,
new Injector($container),
$container,
$consumeMiddlewareDispatcher,
$failureMiddlewareDispatcher,
$callableFactory,
);
// Create loop (SignalLoop requires ext-pcntl; SimpleLoop works without it)
$loop = new SimpleLoop();
// Create queue. Without an adapter the queue runs in synchronous mode (messages are processed
// immediately on push). Pass an adapter (e.g., AMQP, Redis) for asynchronous processing.
$queue = new Queue(
$worker,
$loop,
$logger,
$pushMiddlewareConfig,
);
// Now you can push messages
$message = new DownloadFileMessage(url: 'https://example.com/file.pdf', destinationPath: '/tmp/file.pdf');
$queue->push($message);For multiple queue names, use PredefinedQueueProvider (maps queue names to pre-built queue instances):
use Yiisoft\Queue\Provider\PredefinedQueueProvider;
// PredefinedQueueProvider: pass fully built queue instances.
$provider = new PredefinedQueueProvider([
'queue1' => $queue1,
'queue2' => $queue2,
]);$queue->run(); // Process all messages
$queue->run(10); // Process up to 10 messages$queue->listen(); // Run indefinitely- Usage basics - learn how to create messages and handlers
- Message handler - understand handler formats
- Error handling - configure retries and failure handling
- Adapter list - choose a production-ready adapter