thinkphp使用AMQP库(支持RabbitMq)
1,安装依赖库
composer require php-amqplib/php-amqplib
地址:https://github.com/php-amqplib/php-amqplib
2,mq生产者.php
include(__DIR__ . '../../public/config.php');
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
/**
* Created by PhpStorm.
* User: pandeng
* Date: 2017-07-26
* Time: 21:51
*/
class MessageQueue
{
const exchange = 'router';
const queue = 'msgs';
public static function pushMessage($data)
{
$connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST);
$channel = $connection->channel();
$channel->queue_declare(self::queue, false, true, false, false);
$channel->exchange_declare(self::exchange, 'direct', false, true, false);
$channel->queue_bind(self::queue, self::exchange);
$messageBody = $data;
$message = new AMQPMessage($messageBody, array('content_type' => 'text/plain', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT));
$channel->basic_publish($message, self::exchange);
$channel->close();
$connection->close();
return "ok";
}
}
3.消费者.php
namespace app\index\controller;
include(__DIR__ . '../../../../public/config.php');
use PhpAmqpLib\Connection\AMQPStreamConnection;
use think\Controller;
use think\Log;
use think\Request;
use think\Db;
class MessageConsume extends Controller
{
const exchange = 'router';
const queue = 'msgs';
const consumerTag = 'consumer';
function shutdown($channel, $connection)
{
$channel->close();
$connection->close();
write_log("closed",3);
}
function process_message($message)
{
if ($message->body !== 'quit') {
$obj = json_decode($message->body);
if (!isset($obj->id)) {
echo 'error data\n';
write_log("error data:" . $message->body, 2);
} else {
try {
write_log("data:" . json_encode($message));
} catch (\Think\Exception $e) {
write_log($e->getMessage(), 2);
write_log(json_encode($message), 2);
} catch (\PDOException $pe) {
write_log($pe->getMessage(), 2);
write_log(json_encode($message), 2);
}
}
}
$message->delivery_info['channel']->basic_ack($message->delivery_info['delivery_tag']);
// Send a message with the string "quit" to cancel the consumer.
if ($message->body === 'quit') {
$message->delivery_info['channel']->basic_cancel($message->delivery_info['consumer_tag']);
}
}
/**
* 启动
*
* @return \think\Response
*/
public function start()
{
$connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST);
$channel = $connection->channel();
$channel->queue_declare(self::queue, false, true, false, false);
$channel->exchange_declare(self::exchange, 'direct', false, true, false);
$channel->queue_bind(self::queue, self::exchange);
$channel->basic_consume(self::queue, self::consumerTag, false, false, false, false, array($this, 'process_message'));
register_shutdown_function(array($this, 'shutdown'), $channel, $connection);
while (count($channel->callbacks)) {
$channel->wait();
}
write_log("starting",3);
}
}
- 启动消费者(守护进程)
nohup php index.php index/Message_Consume/start &
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~