环境
系统
Distributor ID: Deepin
Description: Deepin 15.4
Release: 15.4
Codename: unstable
php
PHP 7.0.16-3 (cli) (built: Feb 22 2017 10:03:06) ( NTS )
用途
任务分发和一些耗时异步操作
##安装队列服务 因为是类debian环境,首选apt安装
sudo apt install rabbitmq-server
安装完成查看一下服务
sudo service rabbitmq-server status
如果未启动,手动令其启动
sudo service rabbitmq-server start
安装php驱动
sudo apt install php-amqp
成功后大概需要重新载入一下apache配置
sudo systemctl reload apache2
开启rabbitmq的web监控界面
sudo /usr/sbin/rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Applying plugin configuration to rabbit@xxx-PC... started 6 plugins.
网上找一个小demo,改成一个吟诗程序,跑跑
<?php
/**
生产者示例,逐行读取标准输入并发布到队列,并提供了结束口令over
*/
class publish{
protected $conn_args = array(
'host' => 'localhost',
'port' => '5672',
'login' => 'guest',
'password' => 'guest',
'vhost'=>'/'
);
protected $e_name = 'e_linvo'; //交换机名
//$q_name = 'q_linvo'; //无需队列名
protected $k_route = 'key_1'; //路由key
protected $conn;
protected $channel;
public function __construct()
{
$this->conn = new AMQPConnection($this->conn_args);
if (!$this->conn->connect()) {
die("Cannot connect to the broker!\n");
}
$this->channel = new AMQPChannel($this->conn);
//创建交换机对象
$this->ex = new AMQPExchange($this->channel);
$this->ex->setName($this->e_name);
}
public function poem()
{
$keyin = trim(fgets(STDIN));
if($keyin !== 'over'){
$this->ex->publish($keyin, $this->k_route);
$this->poem($this->ex);
}
}
public function __distruct()
{
$this->conn->disconnect();
}
}
$h = new publish;
$h->poem();
<?php
/*************************************
* PHP amqp(RabbitMQ) Demo - consumer
* Author: Linvo
* Date: 2012/7/30
*************************************/
/**
消费者,接收队列消息并输出
*/
//配置信息
$conn_args = array(
'host' => 'localhost',
'port' => '5672',
'login' => 'guest',
'password' => 'guest',
'vhost'=>'/'
);
$e_name = 'e_linvo'; //交换机名
$q_name = 'q_linvo'; //队列名
$k_route = 'key_1'; //路由key
//创建连接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);
//创建交换机
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
$ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型
$ex->setFlags(AMQP_DURABLE); //持久化
echo "Exchange Status:".$ex->declare()."\n";
//创建队列
$q = new AMQPQueue($channel);
$q->setName($q_name);
$q->setFlags(AMQP_DURABLE); //持久化
echo "Message Total:".$q->declare()."\n";
//绑定交换机与队列,并指定路由键
echo 'Queue Bind: '.$q->bind($e_name, $k_route)."\n";
//阻塞模式接收消息
echo "Message:\n";
while(True){
$q->consume('processMessage');
//$q->consume('processMessage', AMQP_AUTOACK); //自动ACK应答
}
$conn->disconnect();
/**
* 消费回调函数
* 处理消息
*/
function processMessage($envelope, $queue) {
$msg = $envelope->getBody();
echo $msg."\n"; //处理消息
$queue->ack($envelope->getDeliveryTag()); //手动发送ACK应答
}
用终端运行消费者
php consumer.php
Exchange Status:1
Message Total:0
Queue Bind: 1
Message:
用终端运行生产者
php publish.php
效果如下