php rabbitmq 持久化 磁盘 setflags,封装php的RabbitMq

封装php的RabbitMq2020-09-24 10:07:28

11f9674b1af47659e7e652f560f7f4cc.png

简单封装了一个rabbitmq类(业务代码随便写的)

首先是账号密码配置

config.php<?php

return $arr = [

'RabbitMq' => [

// Rabbitmq 服务地址

'host' => '127.0.0.1',

// Rabbitmq 服务端口

'port' => '5672',

// Rabbitmq 帐号

'login' => 'guest',

// Rabbitmq 密码

'password' => 'guest',

'vhost'=>'/'

]

];

基类 base.php<?php

include dirname(__FILE__).'/object.php';

include dirname(__FILE__).'/config.php';

class RabbitMq implements object

{

//保存类实例的静态成员变量

static private $_instance;

static private $_conn;

static private $amp ;

static private $route = 'key_1';

static private $q ;

static private $ex ;

static private $queue;

public static function getInstance(){

global $arr;

if (!(self::$_instance instanceof self)) {

self::$_instance = new self($arr['RabbitMq']);

return self::$_instance;

}

return self::$_instance;

}

private function __construct($conn)

{

//创建连接和channel

$conn = new AMQPConnection($conn);

if(!$conn->connect()) {

die("Cannot connect to the broker!n");

}

self::$_conn = new AMQPChannel($conn);

self::$amp = $conn;

}

/* *

*

* parm 交换机名

* parm 队列名

*

* */

public function listen($exchangeName,$queuename){

self::$queue = $queuename;

return $this->setExchange($exchangeName,$queuename);

}

//连接交换机

public function setExchange($exchangeName,$queueName){

//创建交换机

$ex = new AMQPExchange(self::$_conn);

self::$ex = $ex;

$ex->setName($exchangeName);

$ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型

$ex->setFlags(AMQP_DURABLE); //持久化

$ex->declare();

return self::setQueue($queueName,$exchangeName);

}

//创建队列

private static function setQueue($queueName,$exchangeName){

// 创建队列

$q = new AMQPQueue(self::$_conn);

$q->setName($queueName);

$q->setFlags(AMQP_DURABLE);

$q->declareQueue();

// 用于绑定队列和交换机

$routingKey = self::$route;

$q->bind($exchangeName, $routingKey);

self::$q = $q;

return(self::$_instance);

}

/*

* 消费者

* $fun_name = array($classobj,$function) or function name string

* $autoack 是否自动应答

*

* function processMessage($envelope, $queue) {

$msg = $envelope->getBody();

echo $msg."n"; //处理消息

$queue->ack($envelope->getDeliveryTag());//手动应答

}

*/

public function run($func, $autoack = True){

if (!$func || !self::$q) return False;

while(True){

if ($autoack) {

if(!self::$q->consume($func, AMQP_AUTOACK)){

// self::$q->ack($envelope->getDeliveryTag());

//失败之后会默认进入 noack 队列。下次重新开启会再次调用,目前还不清楚 回调配置应该这里做一个失败反馈

//todu

}

}

self::$q->consume($func);

}

}

private static function closeConn(){

self::$amp->disconnect();

}

public function pushlish($msg){

while (1) {

sleep(1);

if (self::$ex->publish(date('H:i:s') . "用户" . "注册", self::$route)) {

//写入文件等操作

echo $msg;

}

}

}

//__clone方法防止对象被复制克隆

public function __clone()

{

trigger_error('Clone is not allow!', E_USER_ERROR);

}

}

consume 监听类(一个操作对应一个class)<?php

include dirname(__FILE__).'/base.php';

class Add

{

public static function run(){

$dbms='mysql'; //数据库类型

$host='127.0.01'; //数据库主机名

$dbName='test'; //使用的数据库

$user='root'; //数据库连接用户名

$pass='admin'; //对应的密码

$dsn="$dbms:host=$host;dbname=$dbName";

sleep(1);

try {

$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象

/*你还可以进行一次搜索操作

foreach ($dbh->query('SELECT * from FOO') as $row) {

print_r($row); //你可以用 echo($GLOBAL); 来看到这些值

}

*/

$dbh = null;

} catch (PDOException $e) {

die ("Error!: " . $e->getMessage() . "
");

}

//默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:

$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));

$sql = 'INSERT INTO `test`.`t_reg`(`names`) VALUES (9)';

$row = $db->query($sql);

if(!$row){

return false;

}

echo 'OK';

}

}

$consume = new Add();

//tudo

//$s = RabbitMq::getInstance()->listen('jiaohuanji','queue1')->run(array($consume,'run')); 将run函数带入到consume里面作为回调 在consume里面增加$funname ,增加代码粘性

$s = RabbitMq::getInstance()->listen('jiaohuanji','queue1')->run(array($consume,'run'));

push 类(发送者)<?php

include "base.php";

RabbitMq::getInstance()->listen('jiaohuanji','queue1')->pushlish('请求已发送');

接口interface<?php

interface object

{

public static function getInstance();

}

监听 add.php

执行 send.php 即可完成简单的rabit操作以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些PHP高级、架构视频资料和大厂PHP面试PDF| 免费获取可以关注公众号:PHP开源社区

特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。

Tags 标签phprabbitmq

扩展阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值