项目代码
tp5: 通过thinkPHP5.1 tp5实现RabbitMq和 ElasticSearch
其他笔记:
1: 列出队列(Listing queues)
如果你想查看Rabbitmq队列,并且想知道有多少消息存在其中,你(作为特权用户)可以使用rabbitmqctl 工具:
rabbitmqctl list_queues。
在Windows中,省略sudo:
rabbitmqctl.bat list_queues
2: 工作队列
我们发现即使使用CTRL+C杀掉了一个工作者(worker)进程,消息也不会丢失。当工作者(worker)挂掉这后,所有没有响应的消息都会重新发送。
一个很容易犯的错误就是忘了basic_ack,后果很严重。消息在你的程序退出之后就会重新发送,如果它不能够释放没响应的消息,RabbitMQ就会占用越来越多的内存。
为了排除这种错误,你可以使用rabbitmqctl命令,输出messages_unacknowledged字段:
$ sudo rabbitmqctl list_queues name messages_ready messages_unacknowledged
在window系统运行,去掉sudo:
$ rabbitmqctl.bat list_queues name messages_ready messages_unacknowledged
3: rabbitmqctl能够列出服务器上所有的交换器:
$ sudo rabbitmqctl list_exchanges
这个列表中有一些叫做amq.*的交换器。这些都是默认创建的,不过这时候你还不需要使用他们。
4:列出所有现存的绑定 rabbitmqctl list_bindings
5: 如果你想把日志保存到文件中,只需要打开控制台输入: (receive_logs.php 源代码)
$ php receive_logs.php > logs_from_rabbit.log
如果你希望所有的日志信息都输出到屏幕中,打开一个新的终端,然后输入:
$ php receive_logs_direct.php info warning error
# => [*] Waiting for logs. To exit press CTRL+C
如果要触发一个error级别的日志,只需要输入:
$ php emit_log_direct.php error "Run. Run. Or it will explode."
# => [x] Sent 'error':'Run. Run. Or it will explode.'
第一:安装RabbitMq环境
https://my.oschina.net/owenzhang24/blog/5051652
第二:composer require php-amqplib/php-amqplib
第三:代码类
- rabbitMq实现的基础类:application/common/lib/classes/rabbitmq/RabbitMq.php
- 供外部调用的rabbitMq类:application/common/lib/classes/RabbitMqWork.php
- 测试发送消息到rabbitMq中的方法:application/index/controller/Index.php
- 添加php think命令实现接收rabbitMq中的消息:application/common/command/*.php
第四:使用说明
- 发送消息时直接在自己的方法中调用RabbitMqWork.php类中的几个送消息的方法即可。
- application/common/command/下的类都是实现添加php think命令的类,在configure方法中的setName()中设置命令名称,execute()方法是为了执行接收rabbitMq中的消息,同时在application/command.php中return添加设置的命令名称及对应的命令目录地址。
- 贡献文档
- RabbitMQ 中文文档-PHP版。RabbitMQ 中文文档-PHP版 - RabbitMQ PHP版
- RabbitMQ官方文档。RabbitMQ Tutorials — RabbitMQ
第五:源码
application/common/lib/classes/rabbitmq/RabbitMq.php
<?php
//rabbitMq实现的基础类
namespace app\common\lib\classes\rabbitmq;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
class RabbitMq
{
static private $instance;
static private $connection;
static private $channel;
const DIRECT = 'direct';
const TOPIC = 'topic';
const HEADERS = 'headers';
const FANOUT = 'fanout';
static private $exchangeNames = [
self::DIRECT => 'direct_exchange',
self::TOPIC => 'topic_exchange',
self::HEADERS => 'headers_exchange',
self::FANOUT => 'fanout_exchange',
];
const SEVERITYS = [
'info',
'warning',
'error'
];
static private $exchangeName = '';
/**
* RabbitMq constructor.
* @param $ex