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";