消息队列的使用过程大概如下:
(1)客户端连接到消息队列服务器,打开一个channel。
(2)客户端声明一个exchange,并设置相关属性。
(3)客户端声明一个queue,并设置相关属性。
(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。
(5)客户端投递消息到exchange。
使用消息队列的作用: 将一些无需即时返回且耗时的操作提取出来,进行了异步处理;大大降低了服务器的请求相应时间;
(1) producing 发送
(2) queue 队列
(3) producers 生产者
(4) consumers 消费者

根据上面的具体的分析,我们在写代码就很快了,具体代码如下:
<span style="font-size:14px;">/**
* PHP amqp(RabbitMQ) Demo-Test
* @author wanglitao
*/
$exchangeName = 'demo';
$queueName = 'task_queue';
$routeKey = 'task_queue';
$connection = new AMQPConnection(array('host' => '127.0.0.1', 'port' => '5672', 'vhost' => '/', 'login' => 'guest', 'password' => 'guest'));
$connection->connect() or die("Cannot connect to the broker!\n");
// 创建一个连接此连接不同于上面的连接,可以理解为分支连接
$channel = new AMQPChannel($connection);
// 创建交换机(交换机的作用为将不同类型的消息进行区分;把消息分发到不同的消息队列中)
$exchange = new AMQPExchange($channel);
$exchange->setName($exchangeName);
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->declare();
// 创建队列
$queue = new AMQPQueue($channel);
$queue->setName($queueName);
$queue->setFlags(AMQP_DURABLE);
$queue->declare();
// 绑定交换机和路由
$queue->bind($exchangeName, $routeKey);
var_dump('[*] Waiting for messages. To exit press CTRL+C');
// 阻塞模式接收信息(不断的轮询)
while (TRUE) {
$queue->consume('callback');
$channel->qos(0,1);
}
$connection->disconnect();
function callback($envelope, $queue) {
$msg = $envelope->getBody();
var_dump(" [x] Received:" . $msg);
sleep(substr_count($msg,'.'));
$queue->ack($envelope->getDeliveryTag());
}</span><span style="font-size: 16px;">
</span>
<span style="font-size:14px;">/* 下面为producer 信息 */
$exchangeName = 'demo';
$queueName = 'task_queue';
$routeKey = 'task_queue';
$message = empty($argv[1]) ? 'Hello World!' : ' '.$argv[1];
// 创建producer
$connection = new AMQPConnection(array('host' => '127.0.0.1', 'port' => '5672', 'vhost' => '/', 'login' => 'guest', 'password' => 'guest'));
// 连接 amq
$connection->connect() or die("Cannot connect to the broker!\n");
$channel = new AMQPChannel($connection);
// 创建交换机
$exchange = new AMQPExchange($channel);
$exchange->setName($exchangeName);
// 创建队列
$queue = new AMQPQueue($channel);
$queue->setName($queueName);
$queue->setFlags(AMQP_DURABLE);
$queue->declare();
// 发送消息
$exchange->publish($message, $routeKey);
var_dump("[x] Sent $message");
$connection->disconnect();</span>