php 消息队列例子
RabbitMQ方案
安装扩展:需先安装amqp扩展,通过pecl或源码编译安装
生产者示例:
$connection = new AMQPConnection(['host'=>'127.0.0.1']);$channel = $connection->channel();$channel->queue_declare('hello');$channel->basic_publish(new AMQPMessage('Hello'), '', 'hello');
消费者示例:
$callback = function($msg) { echo $msg->body; };$channel->basic_consume('hello', '', false, true, false, false, $callback);while(count($channel->callbacks)) { $channel->wait(); }
注意:RabbitMQ涉及交换机、路由等概念,学习曲线较陡
ThinkPHP队列方案
常驻消费命令:
sudo nohup php think queue:work --daemon --queue createAdminLogQueue > out.file &
代码示例:
Queue::push('app\hook\adminLog\job\AdminLogCreateQueueJob', $data, 'createAdminLogQueue');
适合ThinkPHP框架项目使用2
Redis方案
基础实现:
$redis = new Redis();$redis->connect('127.0.0.1'); // 入队 $redis->lpush('queue', json_encode(['task'=>'updateOrder','params'=>[...]])); // 出队 $task = $redis->rpop('queue');
适合需要轻量级队列的场景56
纯PHP数组方案
$queue = new SplQueue(); $queue->enqueue('task1'); // 入队 $task = $queue->dequeue(); // 出队
适用于单机简单场景
典型应用场景:
异步处理(如日志记录)
系统解耦(如订单与库存系统)
流量削峰(如秒杀活动)
数据冗余(保证重要操作必执行)
注意事项:
消息队列会降低系统可用性(依赖中间件)
需处理重复消费问题(通过唯一ID或幂等操作)
分布式环境要考虑消息顺序和一致性