RabbitMQ和消息传递通常会使用一些术语:

composer require php-amqplib/php-amqplib ,安装的时候尽量版本选择 3.2 以上版本,最开始我安装的是2.8 会缺失一些函数和官网Demo对不上;用于操作 RabbitMQ 消息队列,同时需要开启 sockets 扩展。这里需要去对应的php.ini 中找到 sockets并且打开它,然后重载配置或者重启你的服务;

// 建立连接
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel(); // 获取频道
// 定义队列
$channel->queue_declare('hello', false, false, false, false);
// 创建消息
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'hello'); // 将消息放入队列中
echo "生产者向消息队列中发送信息:Hello World!";
$channel->close();
$connection->close();
在上面这段代码中 我们需要注意的是

// 建立连接
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel(); // 获取频道
// 定义队列
$channel->queue_declare('hello', false, false, false, false);
echo "等待消息,或者使用 Ctrl+C 退出程序。", PHP_EOL;
// 定义接收数据的回调函数
$callback = function ($msg) {
echo '接收到数据: ', $msg->body, PHP_EOL;
};
// 消费队列,获取到数据将调用 callback 回调函数
$channel->basic_consume('hello', '', false, true, false, false, $callback);
// 处理接收消息
while ($channel->is_open()) {
$channel->wait();
}
// 关闭频道和连接
$channel->close();
$connection->close();
我们进行一个测试,可以看到消费者先是输出了接收到的数据,然后正常的打印出来了;

这里我们的测试环境使用的是larveal;其中P端代码我放到了,作为一个基础的路由进行访问,但是在因为这里消费的代码不能这样处理所以消费端的代码我使用了 larveal 提供的命令行


public function redisSend(){
$time = time();
echo "生产者向消息队列中发送信息:Hello World!".$time;
Redis::lpush('hello', 'Hello World!'.$time);
}
class RedisReceivingCommand extends Command
{
protected $signature = 'redis:receiving';
protected $description = '消费队列';
public function handle()
{
echo "等待消息,或者使用 Ctrl+C 退出程序。", PHP_EOL;
while(1){
$data = Redis::rpop('hello');
if ($data){
echo '接收到数据: ', $data, PHP_EOL;
}
}
}
}