function process_message($msg)
 {
     $msg_body = json_decode($msg->body, true);
     if (isset($msg_body['params']) && is_array($msg_body['params'])) {
         $msg_body['params'] = json_encode($msg_body['params']);
     }
     $msg_body = array_values($msg_body);
     $dispatcher = new ShellDispatcher($msg_body, false);
     try {
         $dispatcher->dispatch();
     } catch (Exception $e) {
         RabbitMQ::publish(json_decode($msg->body, true), ['exchange' => 'requeueable', 'queue' => 'requeueable_messages']);
         $newMessage[] = $msg->body;
         $newMessage[] = '==>';
         $newMessage[] = $e->getMessage();
         $newMessage[] = $e->getFile();
         $newMessage[] = $e->getLine();
         $newMessage[] = $e->getTraceAsString();
         $newMessage[] = $e->getCode();
         $newMessage[] = $e->getPrevious();
         RabbitMQ::publish($newMessage, ['exchange' => 'unprocessed', 'queue' => 'unprocessed_messages']);
         EmailSender::sendEmail('*****@*****.**', $msg->body, $newMessage);
     }
     $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
     // Send a message with the string "quit" to cancel the consumer.
     if ($msg->body === 'quit') {
         $msg->delivery_info['channel']->basic_cancel($msg->delivery_info['consumer_tag']);
     }
 }
<?php

require 'vendor/autoload.php';
// RabbitMQ init.
$queue = new RabbitMQ('localhost');
$queue->exchangeDeclare('exchange_name')->queueDeclare('queue_name')->bindQueueToExchange('routing_key');
// consumer limit.
$maxConsumerCount = 3;
$currentConsumerCount = $queue->consumerCount();
if ($currentConsumerCount >= $maxConsumerCount) {
    exit("There are enough consumers. Exit\n");
}
// consumer ttl.
$start = time();
$ttl = 1800;
// second
echo "[*] Waiting for tasks..\n";
// consume callback.
$queue->consume(function ($msg) use($start, $ttl) {
    // do task.
    echo $msg->body;
    // OR do it in the background.
    $message = base64_encode(serialize($msg->body));
    // serialize and encode to send as cli argument.
    $workerFile = realpath(__DIR__) . '/worker.php';
    exec("nohup /usr/bin/php {$workerFile} {$message} > /dev/null 2>&1&");
    // stop consuming when ttl is reached.
    if ($start + $ttl < time()) {
        exit("Need restart. Exit\n");
    }
});
<?php

require 'vendor/autoload.php';
// RabbitMQ init.
$queue = new RabbitMQ('localhost');
$queue->exchangeDeclare('exchange_name')->queueDeclare('queue_name')->bindQueueToExchange('routing_key');
// publish a task.
$msg = sprintf("[%s] Task message is here \n", date('Y-m-d H:i:s'));
$queue->publish($msg);
echo "OK\n";