Публикация также довольно проста: мы можем сразу указать текст сообщения, тип контента, который содержит сообщение, и delivery_mode - как быстро сообщение появится в очереди.
Вызываем basic_publish - и всё отправляется сразу в очередь.
Затем мы можем из очереди что-то получить.
Для этого используем basic_get, указываем, из какой очереди получаем, указываем message. В этом message дополнительно хранится (помимо нашего сообщения и данных, которые мы ему задали) информация о том, какой канал был использован и какой используется сейчас, какой использовался routing_key, и в целом всё, что было вокруг нашего сообщения во время его обработки.
Далее используем basic_ack (acknowledge), т
е. указываем базовую систему работы с блокировкой, получаем тестовое сообщение (в нашем случае - body) и можем его посмотреть.
Теперь поговорим про consume - это подключение в очереди с ожиданием, что в ней будут приходить сообщения. В принципе, мы могли бы сделать basic_get, обернуть его в цикл и просто ждать сообщение из очереди.
Но в очереди может ничего не оказаться, кроме того, мы будем идти неоптимальным путём.
Поэтому и придумали consume - это продолжительное соединение, через которое можно что-то получать.
Первый параметр - очередь
Далее: consumer_tag - это идентификатор consumer'а; nowait - не ждать ответа от сервера (т. е. продолжать получение); callback - функция PHP, которая будет вызвана при получении сообщения.
Получается немного асинхронная модель работы.
Поскольку мы делаем process_message и указываем callback-функцию, мы должны эту функцию обговорить и обозначить.
Она не сильно сложна: нам приходит сообщение, и мы можем с ним что-то сделать.
Также мы можем выйти из этого цикла, т. е. приостановить consume изнутри callback'а.
Для этого нам необходимо, как указано в примере, проверять на body.
Если в body, как в примере, нам пришёл quit, нужно выйти.
Чтобы выйти, мы через message возвращаемся к объекту channel, который содержится в свойстве сообщения, и берём basic_cancel с каким-то тегом. Consumer_tag показывает, кто взял это сообщение для обработки. Соответственно, мы выходим - и наш цикл «падает», заканчивается.
Цикл while нам всё равно понадобится, но решение через consume (против решения через постоянный запрос на получение сообщения) более оптимально, т. к. соединение не создаётся для каждого запроса.
Здесь register_shutdown_function - стандартная функция PHP, в которой мы можем обозначить callback-функцию (например shutdown), которая будет выполнена по окончании работы скрипта.
Когда скрипт заканчивает работу, нам всегда лучше закрывать соединения
В итоге этих действий мы добавили к очереди сообщение с текстом, у нас вызывается basic_cancel и закрываются каналы и соединения. В delivery хранится дополнительная информация о том, как обрабатывалось сообщение.
Если нужно использовать много сообщений сразу, лучше задействовать publish_batch (создаёт транзакцию из нескольких сообщений).