php 本地實現連接rabbitMq ,發送接收消息

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應答機制返回完成

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章