sergiuszm / php-amqplib
这个库是 AMQP 协议的纯 PHP 实现。它已通过 RabbitMQ 进行测试。
Requires
- php: >=5.3.0
- ext-bcmath: *
Requires (Dev)
- phpunit/phpunit: 3.7.*
Suggests
- ext-sockets: Use AMQPSocketConnection
README
这个库是 AMQP 协议的 纯 PHP 实现。它已通过 RabbitMQ 进行测试。
要求:PHP 5.3 由于使用了 命名空间
。
该库被用于 RabbitMQ in Action 和 官方 RabbitMQ 教程 的 PHP 示例。
BC 破坏性更改
从版本 2.0 开始,此库默认使用 AMQP 0.9.1
。您不需要更改代码,但在升级前请进行测试。
支持的 RabbitMQ 扩展
由于该库使用 AMQP 0.9.1
,我们添加了对以下 RabbitMQ 扩展的支持
- 交换机到交换机绑定
- 基本否定
- 发布者确认
- 消费者取消通知
修改现有方法(如 备选交换机
)的扩展也得到支持。
设置
将 composer.json
文件添加到您的项目中
{ "require": { "videlalvaro/php-amqplib": "2.2.*" } }
然后,假设您已安装了 composer,您可以使用以下命令
$ composer.phar install
这将获取库及其依赖项并将其放入您的 vendor 文件夹中。然后,您可以将以下内容添加到您的 .php 文件中以使用库
require_once __DIR__.'/vendor/autoload.php';
然后,您需要使用相关的类,例如
use PhpAmqpLib\Connection\AMQPConnection; use PhpAmqpLib\Message\AMQPMessage;
使用方法
当 RabbitMQ 运行时,打开两个终端,在第一个终端中执行以下命令以启动消费者
$ cd php-amqplib/demo
$ php amqp_consumer.php
然后在另一个终端中做
$ cd php-amqplib/demo
$ php amqp_publisher.php some text to publish
您应该会在另一个终端上的进程中看到消息到达
然后,要停止消费者,向其发送 quit
消息
$ php amqp_publisher.php quit
如果您需要监听连接到 RabbitMQ 的套接字,请参阅非阻塞消费者中的示例。
$ php amqp_consumer_non_blocking.php
教程
为了避免重复,如果您想了解更多关于这个库的信息,请参阅 官方 RabbitMQ 教程。
更多示例
amqp_ha_consumer.php
:演示了镜像队列的使用amqp_consumer_exclusive.php
和amqp_publisher_exclusive.php
:演示了使用专用队列的 fanout 交换机。amqp_consumer_fanout_{1,2}.php
和amqp_publisher_fanout.php
:演示了使用命名队列的 fanout 交换机。basic_get.php
:演示了通过使用 basic get AMQP 调用来从队列中获取消息。
批量发布
假设您有一个生成大量消息的过程,这些消息将被用于同一 exchange
使用相同的 routing_key
和选项(如 mandatory
)。然后,您可以使用 batch_basic_publish
库功能。您可以这样批量处理消息
$msg = new AMQPMessage($msg_body); $ch->batch_basic_publish($msg, $exchange); $msg2 = new AMQPMessage($msg_body); $ch->batch_basic_publish($msg2, $exchange);
然后这样发送批次
$ch->publish_batch();
我们在何时发布消息批次?
假设我们的程序需要从文件中读取,然后按行发布一条消息。根据消息大小,您将不得不决定何时发送批次。您可以选择每 50 条消息发送一次,或者每 100 条消息发送一次。这取决于您。
优化消息发布
另一种加快消息发布速度的方法是重复使用 AMQPMessage
消息实例。您可以创建新的消息如下
$properties = array('content_type' => 'text/plain', 'delivery_mode' => 2);
$msg = new AMQPMessage($body, $properties);
$ch->basic_publish($msg, $exchange);
现在假设您想更改未来消息的消息体,但保留相同的属性,也就是说,您的消息仍然是 text/plain
,并且 delivery_mode
仍然是 2
。如果您为每条发布的消息创建一个新的 AMQPMessage
实例,那么这些属性将不得不重新编码为 AMQP 二进制格式。您可以通过重用 AMQPMessage
并按以下方式重置消息体来避免所有这些操作:
$msg->setBody($body2); $ch->basic_publish($msg, $exchange);
调试
如果您想了解协议层的操作情况,请将以下常量添加到您的代码中:
<?php define('AMQP_DEBUG', true); ... more code ?>
基准测试
要运行发布/消费基准测试,请输入以下命令:
$ make benchmark
测试
要成功运行测试,您需要首先设置测试 用户
和测试 虚拟主机
。
您可以在启动 RabbitMQ 后运行以下命令来完成此操作:
$ rabbitmqctl add_vhost phpamqplib_testbed $ rabbitmqctl add_user phpamqplib phpamqplib_password $ rabbitmqctl set_permissions -p phpamqplib_testbed phpamqplib ".*" ".*" ".*"
一旦您的环境设置完毕,您就可以按以下方式运行您的测试:
$ make test
使用 AMQP 0.8
如果您仍然想使用旧版本的协议,则可以在配置代码中设置以下常量来实现:
define('AMQP_PROTOCOL', '0.8');
默认值为 '0.9.1'
。
提供自己的自动加载器
如果您出于某种原因不想使用 composer,那么您需要一个用于库类的自动加载器。有人报告过使用此自动加载器成功。
原始 README
以下是原始 README 文件的内容。归功于原始作者。
PHP 库实现了高级消息队列协议 (AMQP)。
该库是 py-amqplib 的 Python 代码的移植版本 http://barryp.org/software/py-amqplib/
它已经在 RabbitMQ 服务器上进行了测试。
项目主页: http://code.google.com/p/php-amqplib/
请加入此组进行讨论:
http://groups.google.com/group/php-amqplib-devel
请使用项目页面的错误跟踪系统提交错误报告。
欢迎提交补丁!
作者:Vadim Zaliva lord@crocodile.org