1, 需要一箇中文文檔
https://xiaoxiami.gitbook.io/rabbitmq_into_chinese_php/ying-yong-jiao-cheng/php-ban/1-hello_world
詳細的說明了調用rabbitMq的各種方法。
2,開始連接的時候,第一次使用有許多的坑,最後多謝老鐵給我講解了一下關於bs cs的東西
rabbit 拓展有php寫的 還有c寫的拓展,分成兩種。
php:
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
類似於上面這個就是php的擴展,不用考慮擴展和php的版本問題,這也算是坑的一部分吧。
c:
$conn = new \AMQPConnection($conn_args);
$message = json_encode(array('Hello World3!','php3','c++3:'));
//創建channel
$channel = new \AMQPChannel($conn);
//創建exchange
$ex = new \AMQPExchange($channel);
下面這是c寫的擴展,其實C寫的運行速度快,但是目前使用的是php的擴展
生產者代碼:
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$localhost = ['localhost',5672,'guest','guest'];
$connection = new AMQPStreamConnection('localhost',5672,'guest','guest');
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);
$data = implode(' ', array_slice($argv, 1));
if(empty($data)) $data = "Hello World!";
$msg = new AMQPMessage($data,
array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT)
);
$channel->basic_publish($msg, '', 'task_queue');
echo " [x] Sent ", $data, "\n";
$channel->close();
$connection->close();
消費者代碼:
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$localhost = ['localhost',5672,'guest','guest'];
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);
echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";
$callback = function($msg){
echo " [x] Received ", $msg->body, "\n";
sleep(substr_count($msg->body, '.'));
echo " [x] Done", "\n";
$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
};
$channel->basic_qos(null, 1, null);
$channel->basic_consume('task_queue', '', false, false, false, false, $callback);
while(count($channel->callbacks)) {
$channel->wait();
}
$channel->close();
$connection->close();
//由於項目原因,不能直接使用原生的php擴展
切換爲 c擴展時報錯 暫時未解決
報錯 :Exception 'AMQPConnectionException' with message 'Library error: a socket error occurred - Potential login failure.'
Library error: connection closed unexpectedly - Potential login failure.
百度翻譯 連接失敗,登錄失敗。設置了管理員賬號依然如此,
php - rabbit引用
https://blog.csdn.net/jj546630576/article/details/88533718
在切換爲php擴展時,一直報錯
PHP Fatal error: Class 'PhpAmqpLib\PhpAmqpLib\Connection\AMQPStreamConnection' not found in D:\php\couponapi\commands\RabbitMQController.php on line 214
PHP Fatal Error 'yii\base\ErrorException' with message 'Class 'PhpAmqpLib\PhpAmqpLib\Connection\AMQPStreamConnection' not found'
類名找不到,於是各種改類命名空間,最後發現是安轉的composer的命名目錄指向和我的命名目錄指向有問題,大坑啊
name參數是目錄指向:如果隨便修改,就會找不到類
"name": "php-amqplib/php-amqplib",
"replace": {
"videlalvaro/php-amqplib": "self.version"
},
"type": "library",
"description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.",
"keywords": ["rabbitmq", "message", "queue"],
"homepage": "https://github.com/php-amqplib/php-amqplib/",
此處慘痛的經歷告訴我,沒事別瞎改composer安裝好的目錄。不然還找不到原因
3,安裝好了之後,開始連接通過生產者代碼發送給Mq,並且在Mq接收到之後,會推送到消費者進行消費和輸出
由於目前項目中用到的是YII2的 console命令行,
如果需要在command命令中引用類庫,需要再console.php進行配置數據庫和加載,否則會報錯。
同事的意思:是想在是接收到Mq接收的消息之後再把這些消息經過一輪處理放到redis隊列再處理
我是直接在command全部處理完所有的邏輯,到時候在通過Mq的Ack應答機制返回完成