tp8 使用rabbitMQ(1)簡單隊列

php8.0 使用 rabbitmq 要使用 3.6版本以上的, 并且還要開啟 php.ini中的 socket 擴展

在這里插入圖片描述
php think make:command SimpleMQProduce //創建一個生產者命令行
php think make:command SimpleMQConsumer //創建一個消費者命令行

在這里插入圖片描述

在這里插入圖片描述

代碼中的消息持久化的說明

RabbitMQ 消息持久化
持久化是為提高rabbitmq消息的可靠性,防止在異常情況(重啟,關閉,宕機)下數據的丟失。設置完隊列和消息的持久化,并不能完全保證消息不會丟失。盡管它告訴 RabbitMQ 將消息保存到磁盤,但當 RabbitMQ 接受消息但尚未保存消息時,仍有一個較短的時間窗口。另外, RabbitMQ 不會對每條消息都執行 fsync(2) – 它可能只是保存到緩存中,而不是真正寫入磁盤。持久性保證并不強,但對于我們的簡單任務隊列來說已經足夠了。如果您需要更強的保證,則可以使用發布者確認(RabbitMQ 消息確認機制)

生產者代碼

<?php
declare (strict_types = 1);namespace app\command;use ba\Exception;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;//本類是模式中的 生產者 produce
class SimpleMQProduce extends Command
{protected function configure(){// 指令配置$this->setName('SimpleMQ')->setDescription('這是一個隊列的 Hello模式 (最簡單的應用模式),使用了默認的交換機,只需要建一個隊列就可以了');}protected function execute(Input $input, Output $output){//獲取連接$connection = $this->connectRabbitMQ();//獲取連接的通道$channel = $connection->channel();//直接創建一個隊列/*** 關于 queue_declare參數的說明* params  queue  隊列的名稱* params  passive 是否消極的聲明隊列,如果存在,就把隊列的信息返回, 如果沒有就拋出錯誤,(是的, 你沒看錯,這個參數很雞肋,所以一般為 false)* params  durable 是否持久化,意思是說就算隊列服務掛了, 也不會丟失隊列* params  exclusive  是否排外,如果設置為true ,表示只有本次連接中的channel 可以訪問,其它channel 是不可以訪問的* params  auto_delete  設置是否自動刪除。為true 則設置隊列為自動刪除。自動刪除的前提是, 至少有一個消費者連接到這個隊列,之后所有與這個隊列連接的消費者都斷開時,才會自動刪除* params  nowait 相當于做一個異步版的聲明, 如果設置成true, 就是說方法調用完就結束,也不用等待創建隊列是否成功,一般也設為false*/$channel->queue_declare("hello",false,false,false,false,false);for ($i = 0; $i < 20; $i++) {$message = ["name"=>"huang".$i,"age"=>$i,"sex"=>"man".$i];$msg = new AMQPMessage(json_encode($message),["delivery_mode"=>AMQPMessage::DELIVERY_MODE_PERSISTENT          //使消息持久化]);$channel->basic_publish($msg,"",'hello');  //簡單模式下,routing_key 和 隊列名稱是一樣的sleep(1);}//生產者調用完成后要關閉資源$channel->close();}//這個方法是建立一個 rabbitMQ 的資源連接protected function connectRabbitMQ(){try{$connection = new AMQPStreamConnection("192.168.3.228",'5672',"admin","123456");return $connection;}catch(Exception $e){throw new Exception("隊列連接失敗");}}}

消費者代碼

<?php
declare (strict_types = 1);namespace app\command;use ba\Exception;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;class SimpleMQConsumer extends Command
{protected function configure(){// 指令配置$this->setName('simplemqconsumer')->setDescription('這是rabbitMQ的簡單模式的消費者代碼');}protected function execute(Input $input, Output $output){//創建一個資源連接$connection = $this->connectRabbitMQ();$channel = $connection->channel();//定義一個處理函數$callback = function($msg){$body = $msg->body;$bodyArr = json_decode($body,true);echo $bodyArr["name"] ."--".$bodyArr["age"]. "--".$bodyArr["sex"];};//聲明隊列,這個函數的 passive ,如果有不返回這個隊列的信息,如果沒有就拋出異常$channel->queue_declare("hello",false,false,false,false,false);//從隊列中消費數據/*** 參數說明* params queue 隊列名稱* params consumer_tag 消費者標簽* params no_local AMQP標準  RabbitMQ沒有實現, 默認為false* params no_ack 收到消息后是否不需要回復 如果為true表示不回復, 一般是要回復的 設置為 false* params exclusive 排他消費,即這個隊列只能由一個消費者來消費* params nowait 相當于一個異步,在執行完成之后返回結果,不堵塞* params callback 處理消息的回調方法*/$channel->basic_consume("hello",'',false,true,false,false,$callback);//等待隊列執行完成while(count($channel->callbacks)){$channel->wait();}}//這個方法是建立一個 rabbitMQ 的資源連接protected function connectRabbitMQ(){try{$connection = new AMQPStreamConnection("192.168.3.228",'5672',"admin","123456");return $connection;}catch(Exception $e){throw new Exception("隊列連接失敗");}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166379.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

#Js篇:var、let和 const

var 聲明的變量具有函數作用域或者全局作用域&#xff1b;存在變量提升&#xff0c;即在執行上下文中&#xff0c;變量會被提升到函數或全局作用域的頂部&#xff0c;但初始化的賦值不會提升&#xff1b;可以重復聲明同一個變量不會報錯&#xff1b;可以被重新賦值&#xff1b…

vue3 + Ant Design Vue國際化,組件默認顯示中文

官網 寫入App.vue <template><ConfigProvider :locale"zhCN"><router-view :key"$route.fullPath"></router-view></ConfigProvider> </template><script setup> import { ConfigProvider } from "ant-de…

某上市證券公司:管控文件交換行為 保護核心數據資產

客戶簡介 某上市證券公司成立于2001年&#xff0c;經營范圍包括&#xff1a;證券經紀、證券投資咨詢、證券承銷與保薦、證券自營等。經過多年發展&#xff0c;在北京、上海、深圳、重慶、杭州、廈門等國內主要中心城市及甘肅省內各地市設立了15家分公司和80余家證券營業部。20…

軟文推廣中如何提煉好產品賣點,媒介盒子分享

內容同質化的時代下&#xff0c;企業應該如何讓用戶留下印象&#xff0c;并且成功將產品賣出去&#xff0c;核心思維就在于提煉產品賣點&#xff0c;產品賣點是銷量提升的關鍵&#xff0c;相信企業在推廣產品時都會有點困惑&#xff0c;感覺自家產品和競品比起來只是logo、外觀…

壓縮與解壓縮

核心接口 Compressor package com.xxx.arch.mw.nbp.common.csp;import com.xxx.arch.mw.nbp.common.constant.CommonConstants; import com.xxx.arch.mw.nbp.common.exception.NbpException;import static com.xxx.arch.mw.nbp.common.csp.CompressorEnum.ZSTD;/*** */ publi…

【mybatis】使用<foreach>報錯parameter ‘id‘ not found

程序其他sql都執行正常&#xff0c;也寫了param注解&#xff0c;但是還是一直報parameter ‘id’ not found。最后發現是調用sql的實現類里ids的入參對象名稱不叫ids&#xff0c;叫idList 代碼如下&#xff1a; List<Map<String,String>> resultmapper.sql(date,…

【攻防世界-misc】pure_color

1.方法一&#xff1a;用畫圖工具打開圖片&#xff0c;將圖片拷貝至虛擬機win7桌面&#xff0c; 點“屬性”&#xff0c;顏色設置為“黑白”&#xff0c; 出現flag值。 2.方法二&#xff1a;使用Stegsilve打開&#xff0c;分析圖片 將圖片打開&#xff0c;按左右鍵查找&#xff…

c#數據庫:vs2022 加入mysql數據源

網上有VS2019連接MySQL數據庫的&#xff0c;那么VS2022&#xff0c;VS2023如果和連接到mysql數據庫呢&#xff0c;這里總結一下我的經歷&#xff1a; 1、首先下載ODBC驅動安裝包 當前下載地址&#xff1a;https://dev.mysql.com/downloads/connector/odbc/ 2、ODBC安裝 下載完…

openGauss學習筆記-131 openGauss 數據庫運維-啟停openGauss

文章目錄 openGauss學習筆記-131 openGauss 數據庫運維-啟停openGauss131.1 啟動openGauss131.2 停止openGauss131.3 示例131.3.1 啟動openGauss131.3.2 停止openGauss 131.4 錯誤排查 openGauss學習筆記-131 openGauss 數據庫運維-啟停openGauss 131.1 啟動openGauss 以操作系…

【ChatGLM3-6B】Docker下快速部署

【ChatGLM2-6B】小白入門及Docker下部署 前提下載安裝包網盤地址 開始安裝加載鏡像啟動鏡像進入容器啟動模型交互頁面訪問頁面地址 前提 安裝好了docker安裝好了NVIDIA顯卡16G 下載安裝包 網盤地址 ? 這里因為網盤上傳文件有大小限制&#xff0c;所以使用了分卷壓縮的方式…

【深度學習】CNN中pooling層的作用

1、pooling是在卷積網絡&#xff08;CNN&#xff09;中一般在卷積層&#xff08;conv&#xff09;之后使用的特征提取層&#xff0c;使用pooling技術將卷積層后得到的小鄰域內的特征點整合得到新的特征。一方面防止無用參數增加時間復雜度&#xff0c;一方面增加了特征的整合度…

MySql數據庫常用指令(一)

MySql數據庫常用指令&#xff08;一&#xff09; 一、MySQL 創建數據庫二、MySQL 刪除數據庫三、選擇數據庫四、選擇數據庫五、創建數據表六、刪除數據表七、插入數據八、查詢數據 注&#xff1a;文中TEST為測試所用數據庫&#xff0c;根據實際應用修改 一、MySQL 創建數據庫 …

JVM中如何實現垃圾收集

Java虛擬機&#xff08;JVM&#xff09;使用垃圾收集器&#xff08;Garbage Collector&#xff09;來管理內存&#xff0c;清理不再使用的對象以釋放內存空間。垃圾收集的主要目標是自動化內存管理&#xff0c;使開發人員無需顯式地釋放不再使用的內存&#xff0c;從而降低了內…

Mysql面經

Select語句的執行順序 1、from 子句組裝來自不同數據源的數據&#xff1b; 2、where 子句基于指定的條件對記錄行進行篩選&#xff1b; 3、group by 子句將數據劃分為多個分組&#xff1b; 4、使用聚集函數進行計算&#xff1b;AVG() SUM() MAX() MIN() COUNT() 5、使用 havin…

Vue模板引用

Vue的模板引用是為了處理直接訪問DOM底層而做的補充處理&#xff0c;畢竟Vue宣稱是基于組件的&#xff0c;這種補充處理是對Vue框架的補充。在前端基于BOMDOMjs的組成來看&#xff0c;Vue保留模板引用是留下了一種框架設計的余裕。 模板引用案例如下&#xff1a; <script s…

2016年8月18日 Go生態洞察:Go 1.7版本二進制文件縮小

&#x1f337;&#x1f341; 博主貓頭虎&#xff08;&#x1f405;&#x1f43e;&#xff09;帶您 Go to New World?&#x1f341; &#x1f984; 博客首頁——&#x1f405;&#x1f43e;貓頭虎的博客&#x1f390; &#x1f433; 《面試題大全專欄》 &#x1f995; 文章圖文…

【經驗分享】在vm中安裝openEuler及使用yum安裝openGauss

1.前言 隨著互聯網時代對數據庫的新要求,以PostgreSQL為基礎的開源數據庫openGauss應運而生。openGauss在保持PostgreSQL接口兼容的前提下,對其查詢優化器、高可用特性等進行了全面優化,實現了超高性能。 同時,openGauss作為社區項目,新增功能持續豐富。優點是查詢性能高、可…

機器學習——詞向量模型(CBOW代碼實現-未開始)

本來是不打算做這個CBOW代碼案例的&#xff0c;想快馬加鞭看看前饋神經網絡 畢竟書都買好了 可是…可是…我看書的時候&#xff0c;感覺有點兒困難&#xff0c;哭的很大聲… 感覺自己腦細胞可能無法這么快接受 要不&#xff0c;還是退而求個稍微難度沒那么大的事&#xff0c;想…

【多線程】-- 01 線程創建之繼承Thread多線程同步下載網絡圖片

多線程 1 簡介 1.1 多任務、多線程 普通方法調用&#xff1a;只有主線程一條執行路徑 多線程&#xff1a;多條執行路徑&#xff0c;主線程和子線程并行交替執行 如下圖所示&#xff1a; 1.2 程序.進程.線程 一個進程可以有多個線程&#xff0c;例如視頻中同時聽聲音、看圖…

idea 問題合集

調試按鈕失效&#xff1a; 依次點擊&#xff1a;Modules-web-src-Sources&#xff0c;重啟IDEA即可&#xff08;網上看到的方法&#xff0c;原因呢未明&#xff09;