导航:首页 > 编程语言 > rabbitmqphp扩展

rabbitmqphp扩展

发布时间:2022-04-18 03:43:18

‘壹’ rabb.it有哪些用户值得关注

关于RabbitMQ的文章网上转来转去最多的是一篇<<[RabbitMQ+python入门经典] 兔子和兔子窝>>(随便给个链接了).这篇文章的讲解是很风趣,很适合用来理解一些基础概念.理解了概念以后就要进行一些实际性的实验了.原文给的python的例子.不是笔者想要的,笔者要用php的.

关于php和rabbitmq网上又有一篇被转来转去的文章<<安装 php-rabbit: RabbitMQ 的 PHP 扩展>>.文章里提到的php-rabbit,笔者死活是访问不了:

让几个不同地方的哥们帮着访问下载,都下载不了,推断可能是这个项目被删除了.问一个哥们儿,说他们那用的是php-amqp.从官方下的库竟然不好使.于是死皮懒脸的管哥们要了他们正在用的版本和示例,又鉴于网上 php-amqp版本的rabbit操作细节甚少(可以说没有么?),于是有了今天这份儿总结.
测试平台:
Distributor ID: Ubuntu
Description: Ubuntu 9.10
Release: 9.10
Codename: karmic

既然是ubuntu,安装rabbitmq服务端是很easy的事情,一条命令搞定:
apt-get install rabbitmq-server

接下来的就是折腾了将近两天的心得体会了.

1.必需掌握的指令
添加用户:
rabbitmqctl add_user rainbird password
添加权限:
rabbitmqctl set_permissions -p "/" rainbird ".*" ".*" ".*"
删除测试用户:
rabbitmqctl delete_user guest

所有指令列表(很简单的英文):
add_user <UserName> <Password>
delete_user <UserName>
change_password <UserName> <NewPassword>
list_users
add_vhost <VHostPath>
delete_vhost <VHostPath>
list_vhosts
set_permissions [-p <VHostPath>] <UserName> <Regexp> <Regexp> <Regexp>
clear_permissions [-p <VHostPath>] <UserName>
list_permissions [-p <VHostPath>]
list_user_permissions <UserName>
list_queues [-p <VHostPath>] [<QueueInfoItem> ...]
list_exchanges [-p <VHostPath>] [<ExchangeInfoItem> ...]
list_bindings [-p <VHostPath>]
list_connections [<ConnectionInfoItem> ...]
2.vhost / 不能删除

删除/以后,新建立的vhost不能正常使用(即便不删除/,新建立的vhost也是不能正常使用).不知道为什么,有待研究.

3.关于持久化

示例里没有一点儿和持久化相关的东东,而这却是笔者最关心的,想想作为消息服务器如果不能保证消息一定被接收到,算什么事儿啊?比着网上狂转的python版本从php-amqp的库里一点一点儿翻,找到了如下持久化的设置:

接收端声明队列和交换机自动建立:
$ch->queue_declare($_QUEUE,false,true,false,false);
第三个参数设置true保证服务器重启后,自动建立队列
第五个参数设置成false防止接收端没连接的时候丢失消息
$ch->exchange_declare($EXCHANGE, 'direct', false, true, false);
第四个参数设置true保证重启后,自动建立交换机
第五个参数设置false防止接收端断开后,交换机被删除

发布端声明消息持久:
$message = new AMQPMessage(serialize($object), array('content_type' => 'text/plain', 'delivery_mode' => 2));

同时满足了上面三个条件,就可以保证未接收的消息在服务器意外重启以后依然存在了.

4.持久化的后遗症

比如说你初始化了一个队列msgs.你会发现它真的持久了!每次服务器端重启后,通过list_queues命令查看的时候都存在.但是时间久了,这个msgs我们并不需要了,怎么办呢?笔者发现,想清除这个队列只能删除它所在的vhost,然后再重建vhost,再设置vhost的权限.
rabbitmqctl delete_vhost /
rabbitmqctl add_vhost /
rabbitmqctl set_permissions -p / rainbird '.*' '.*' '.*'

要注意,如果这个操作过程中有接收端处于连接状态它们不会自动断开,但也不会再收到消息,需要手动重新连接一下.

5.关于修改监听ip和监听端口

出于一些需要,比如我们有多个ip,我们希望rabbitmq仅运行在指定的ip上.或者考虑到安全问题,我们希望修改一下rabbitmq的监听端口.默认安装完成以后,在/etc下面会有一个rabbitmq的空目录,这时候我们需要手工创建rabbitmq.conf,并写入相关内容.
vi /etc/rabbitmq/rabbitmq.conf
RABBITMQ_NODE_IP_ADDRESS=0.0.0.0
RABBITMQ_NODE_PORT=2222

保存以后重启服务就生效了.

这个东东网上又没介绍,翻了半天+无限尝试才搞出来.

6.关于运行接收端cpu100%问题

第一眼看到接收端会运行一个while等待消息的时候,笔者就知道这个进程肯定cpu占用会100%.在代码里几处while尝试添加usleep无效后,笔者最后还是在官方的问题列表里找到了答案:
vi +286 amqp_wire.inc
293 while ($read < $n && (false !== ($buf = fread($this->sock, $n - $read))))
294 {
295 usleep(50000);
296 $read += strlen($buf);
297 $res .= $buf;
298 }

笔者的出发点是对的,只是没找对while.可能有人会奇怪为什么要用usleep(50000)呢?实际上笔者有遇到运行php起来的daemon导致cpu100%的情况.当时笔者加的是usleep(500000)也就是半秒钟.这样就可以使进程看上去cpu占用为0.没想到再降一个数量级也是可以正常的,这次算赚到了.

7.学到了error_log函数

以前有见过这个函数,以为是向系统日志里写log的时候才用得到呢,没想到还可以像下面这样用:
function debug_msg($s)
{
//error_log($s);
}

在不同的地方写上debug_msg,最后不用的时候时候,直接注释掉error_log,不错的小技巧!

暂时就摸索出来这么多东西了,准备拿几个不重要的任务跑跑稳定性试试.

‘贰’ rabbitmq官网中的php测试helloworld的代码是否有问题

<?php
require_once __DIR__ . '/vendor/autoload.php';use PhpAmqpLib\Connection\AMQPConnection;use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPConnection('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 " [x] Sent 'Hello World!'\n";
$channel->close();
$connection->close();
?>
receive.php
<?php
require_once __DIR__ . '/vendor/autoload.php';use PhpAmqpLib\Connection\AMQPConnection;$connection = new AMQPConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";$callback = function($msg) {
echo " [x] Received ", $msg->body, "\n";
};
$channel->basic_consume('hello', '', false, true, false, false, $callback);while(count($channel->callbacks)) {
$channel->wait();
}
$channel->close();
$connection->close();
?>

‘叁’ php rabbitmq能实现什么功能

队列你说能实现什么功能?一般都是用来做无须前台参与的功能,或者说避免前台等待时间过长的功能,比如,你要发邮件。这个时间就比较长,如果你扔队列里面,告诉前台已经OK,然后由队列 去慢慢发,是不是给用户的感觉就是速度好快啊。

‘肆’ php下rabbitmq怎么实现消费者自动触发

您好,很高兴为您解答。 declare一个队列,置AMQP_PASSIVE标志位,就不会影响服务端状态,并返回消息计数。 $conn = new AMQPConnection();//...$queue = new AMQPQueue($conn);$queue->setFlags(AMQP_PASSIVE);$messageCount = $queue->declare

‘伍’ 我为什么要选择RabbitMQ

RabbitMQMQ在云计算的地位RabbitMQ大事记RabbitMQ卖点健壮易于使用高性能强大开源社区支持AMQP工作组成员,

目前支持AMQP0-9-1RabbitMQ生态圈显微镜看RabbitMQ为什么要用Erlang实现Erlang消息机制与AMQP极度吻合高并发时间检验的高可靠高性能集群易扩展强大的管理功能方便的问题定位支持

AMQP交互图实现足够简单清晰高并发的秘密处处维稳自我保护AMQP协议级别流控ErlangVM层面内存、

CPU过载防护集群层面容灾预先警报性能(单Q)性能(8个Q)集群(逻辑视图)集群(物理布局)高可用集群无中心点。

‘陆’ php怎么接收rabbitmq的数据

are一个队列,置AMQP_PASSIVE标志位,就不会影响服务端状态,并返回消息计数。 $conn = new AMQPConnection(); //... $queue = new AMQPQueue($conn); $queue->setFlags(AMQP_PASSIVE); $messageCount = $queue->declare($queueName);

‘柒’ php 从rabbitmq consume 和 get的区别

以下是阿里云查到的解释

在RabbitMQ中消费者有2种方式获取队列中的消息:

a)一种是通过basic.consume命令,订阅某一个队列中的消息,channel会自动在处理完上一条消息之后,接收下一条消息。(同一个channel消息处理是串行的)。除非关闭channel或者取消订阅,否则客户端将会一直接收队列的消息。

b)另外一种方式是通过basic.get命令主动获取队列中的消息,但是绝对不可以通过循环调用basic.get来代替basic.consume,这是因为basic.get RabbitMQ在实际执行的时候,是首先consume某一个队列,然后检索第一条消息,然后再取消订阅。如果是高吞吐率的消费者,最好还是建议使用basic.consume。

简单总结一下就是说:

consume是只要队列里面还有消息就一直取。

get是只取了队列里面的第一条消息。

因为get开销大,如果需要从一个队列取消息的话,首选consume方式,慎用循环get方式。

‘捌’ php rabbitmq 哪个扩展最好

Linux 上面一般需要自己编译
注意:扩展是C写的,由于C与RabbitMQ通信一般需要依赖rabbitmq-c库(也就是librabbitmq),所以编译扩展前需要先装依赖库。不同版本的扩展,对php版本和librabbitmq兼容性不一样。下面这个版本是经过本人测试的,可以兼容的。
rabbitmq-c -0.4.1 , amqp 扩展 1.4.0 , php 5.5.9

一键安装脚本:

[cpp] view plain
#!/bin/bash
set -e

#install cmake
yum -y install cmake

#download rabbitmq-c
wget https://github.com/alanxz/rabbitmq-c/rel

‘玖’ celery队列调用rabbitmq

相比 PHP,Python 可以非常自然的扩展到队列(RabbitMQ)、后台处理系统(基于 Celery)、数据挖掘(SciPy、NumPy)、文本处理(NLTK)、系统部署(Fabric)、监控(Supervisord)等所有方面,而 PHP 只能做网页前台。

阅读全文

与rabbitmqphp扩展相关的资料

热点内容
dns使用加密措施吗 浏览:172
php独立运行 浏览:530
手机sh执行命令 浏览:727
云服务器的角色 浏览:733
单片机频率比例 浏览:840
我的世界服务器如何关闭正版验证 浏览:504
如何查roid服务器上的 浏览:130
安卓手机主板如何撬芯片不掉电 浏览:249
php各个框架的优缺点 浏览:101
php1100生成数组 浏览:359
以后做平面设计好还是程序员好 浏览:552
云服务器应用管理 浏览:438
饥荒云服务器搭建过程 浏览:186
可编程控制器优点 浏览:99
压缩垃圾车说明书 浏览:28
五轮书pdf 浏览:802
单片机定时流水中断系统流水灯 浏览:701
u8如何连接服务器配置 浏览:68
动力在于缓解压力 浏览:867
报考科一用什么app 浏览:346