PDO和消息隊(duì)列的一點(diǎn)個(gè)人理解
Nov 30, 2016 pm 11:59 PM什么是消息隊(duì)列,百度百科說,···消息隊(duì)列····是在消息的傳輸過程中保存消息的容器。
看著網(wǎng)上林林總總的文章,都說是為了應(yīng)對(duì)高并發(fā),處理數(shù)據(jù)量超級(jí)大的一種數(shù)據(jù)容器,也可以說是利用各種方式,先把數(shù)據(jù)存儲(chǔ)在一個(gè)···容器···中,然后,再慢慢從這個(gè)容器中獲取數(shù)據(jù),實(shí)現(xiàn)·····異步操作數(shù)據(jù)庫(kù)·····的方式,以便降低數(shù)據(jù)庫(kù)的壓力。
不管消息隊(duì)列是什么,個(gè)人姑且認(rèn)為它就是一種存儲(chǔ)數(shù)據(jù)的···容器···,就這么簡(jiǎn)單明了,呵呵,因?yàn)楸救藢?duì)消息隊(duì)列這東西研究的比較膚淺。
不過,在這里,我還是要賣弄一下一個(gè)個(gè)人的小實(shí)驗(yàn)代碼,呵呵,假若下面的東西與消息隊(duì)列相離太遠(yuǎn),那么請(qǐng)看官可別見怪哦,因?yàn)槲疑厦嬉呀?jīng)聲明的很清楚了,本人對(duì)這東西還是不甚了解,只不過是工作之余賣弄一下‘文采’而已,所以,假如真有誤解消息隊(duì)列這個(gè)東西,我只能說聲,請(qǐng)你指正我的錯(cuò)誤,讓筆者迷途知返。
先給出連接mysql數(shù)據(jù)庫(kù)配置文件mysql.ini的內(nèi)容:
<span style="color: #800000; font-weight: bold">[</span><span style="color: #800000">database</span><span style="color: #800000; font-weight: bold">]</span><span style="color: #000000"> driver </span>=<span style="color: #000000"> mysql host </span>= 127.0.0.1<span style="color: #000000"> port </span>= 3306<span style="color: #000000"> dbname </span>=<span style="color: #000000"> mysql username </span>=<span style="color: #000000"> root password </span>= 1234 <span style="color: #800000; font-weight: bold">[</span><span style="color: #800000">options</span><span style="color: #800000; font-weight: bold">]</span><span style="color: #000000"> PDO::MYSQL_ATTR_INIT_COMMAND </span>= set names utf8
數(shù)據(jù)表文件queue.sql的內(nèi)容:
<span style="color: #008080">--</span><span style="color: #008080"> 消息隊(duì)列測(cè)試</span><span style="color: #008080"> --</span><span style="color: #008080"> 商品表</span> <span style="color: #0000ff">create</span> <span style="color: #0000ff">table</span><span style="color: #000000"> goods( id </span><span style="color: #0000ff">int</span> unsigned <span style="color: #0000ff">primary</span> <span style="color: #0000ff">key</span><span style="color: #000000"> auto_increment, goodsname </span><span style="color: #0000ff">varchar</span>(<span style="color: #800000; font-weight: bold">40</span>) <span style="color: #808080">not</span> <span style="color: #0000ff">null</span> comment <span style="color: #ff0000">'</span><span style="color: #ff0000">商品名</span><span style="color: #ff0000">'</span><span style="color: #000000">, price </span><span style="color: #0000ff">decimal</span>(<span style="color: #800000; font-weight: bold">9</span>,<span style="color: #800000; font-weight: bold">2</span>) <span style="color: #808080">not</span> <span style="color: #0000ff">null</span> comment <span style="color: #ff0000">'</span><span style="color: #ff0000">價(jià)格</span><span style="color: #ff0000">'</span><span style="color: #000000">, category_id </span><span style="color: #0000ff">tinyint</span> unsigned <span style="color: #808080">not</span> <span style="color: #0000ff">null</span> comment <span style="color: #ff0000">'</span><span style="color: #ff0000">商品類別id</span><span style="color: #ff0000">'</span><span style="color: #000000">, sort </span><span style="color: #0000ff">tinyint</span> comment <span style="color: #ff0000">'</span><span style="color: #ff0000">商品排序</span><span style="color: #ff0000">'</span><span style="color: #000000">, description </span><span style="color: #0000ff">varchar</span>(<span style="color: #800000; font-weight: bold">255</span>) comment <span style="color: #ff0000">'</span><span style="color: #ff0000">商品描述</span><span style="color: #ff0000">'</span><span style="color: #000000">, remark </span><span style="color: #0000ff">varchar</span>(<span style="color: #800000; font-weight: bold">255</span>) comment <span style="color: #ff0000">'</span><span style="color: #ff0000">備注</span><span style="color: #ff0000">'</span><span style="color: #000000"> )engine InnoDB </span><span style="color: #0000ff">default</span> charset<span style="color: #808080">=</span><span style="color: #000000">utf8; </span><span style="color: #0000ff">insert</span> <span style="color: #0000ff">into</span> goods <span style="color: #0000ff">values</span>(<span style="color: #0000ff">default</span>,<span style="color: #ff0000">'</span><span style="color: #ff0000">iPhone5s</span><span style="color: #ff0000">'</span>,<span style="color: #800000; font-weight: bold">5999</span>,<span style="color: #800000; font-weight: bold">1</span>,<span style="color: #800000; font-weight: bold">1</span>,<span style="color: #ff0000">'</span><span style="color: #ff0000">美國(guó)入口貴重電子產(chǎn)品</span><span style="color: #ff0000">'</span>,<span style="color: #ff0000">'</span><span style="color: #ff0000">請(qǐng)多多銷售</span><span style="color: #ff0000">'</span>),(<span style="color: #0000ff">default</span>,<span style="color: #ff0000">'</span><span style="color: #ff0000">宏基手提電腦1</span><span style="color: #ff0000">'</span>,<span style="color: #800000; font-weight: bold">4888</span>,<span style="color: #800000; font-weight: bold">3</span>,<span style="color: #800000; font-weight: bold">1</span>,<span style="color: #ff0000">'</span><span style="color: #ff0000">價(jià)格劃算好電腦</span><span style="color: #ff0000">'</span>,<span style="color: #0000ff">null</span>),(<span style="color: #0000ff">default</span>,<span style="color: #ff0000">'</span><span style="color: #ff0000">f-30絨衣</span><span style="color: #ff0000">'</span>,<span style="color: #800000; font-weight: bold">200</span>,<span style="color: #800000; font-weight: bold">2</span>,<span style="color: #800000; font-weight: bold">1</span>,<span style="color: #ff0000">'</span><span style="color: #ff0000">以純白色厚皮羽絨服</span><span style="color: #ff0000">'</span>,<span style="color: #0000ff">null</span>),(<span style="color: #0000ff">default</span>,<span style="color: #ff0000">'</span><span style="color: #ff0000">n-100鞋子</span><span style="color: #ff0000">'</span>,<span style="color: #800000; font-weight: bold">300</span>,<span style="color: #800000; font-weight: bold">4</span>,<span style="color: #800000; font-weight: bold">1</span>,<span style="color: #ff0000">'</span><span style="color: #ff0000">Nick品牌</span><span style="color: #ff0000">'</span>,<span style="color: #0000ff">null</span>);
下面是簡(jiǎn)單的消息隊(duì)列實(shí)現(xiàn)PDO商品入庫(kù)的代碼:
鄭重提醒:請(qǐng)認(rèn)真看我的注釋,請(qǐng)認(rèn)真看我的注釋,請(qǐng)認(rèn)真看我的注釋。重要的信息要說三遍,呵呵!
<span style="color: #000000">php namespace Home; </span><span style="color: #008080">header</span>('content-type:text/html;charset=utf-8;'<span style="color: #000000">); </span><span style="color: #008000">//</span><span style="color: #008000">引入PDO類</span> <span style="color: #0000ff">use</span><span style="color: #000000"> \PDO; </span><span style="color: #0000ff">use</span><span style="color: #000000"> \PDOStatement; </span><span style="color: #0000ff">use</span><span style="color: #000000"> \PDOException; </span><span style="color: #008000">/*</span><span style="color: #008000">簡(jiǎn)單消息隊(duì)列</span><span style="color: #008000">*/</span> <span style="color: #0000ff">class</span><span style="color: #000000"> Queue{ </span><span style="color: #008000">//</span><span style="color: #008000">容器可以是私有,最好是公有</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">public</span> <span style="color: #800080">$container</span>=<span style="color: #0000ff">array</span><span style="color: #000000">(); </span><span style="color: #008000">//</span><span style="color: #008000">把PDO對(duì)象存放到屬性中是為了跨方法使用</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">private</span> <span style="color: #800080">$pdo</span><span style="color: #000000">; </span><span style="color: #008000">//</span><span style="color: #008000">構(gòu)造函數(shù)實(shí)現(xiàn)初始化PDO連接數(shù)據(jù)庫(kù)</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">function</span> __construct(<span style="color: #800080">$file</span> = './mysql.ini'){<span style="color: #008000">//</span><span style="color: #008000">mysql數(shù)據(jù)庫(kù)的配置文件,./mysql.ini與這個(gè)類是同一個(gè)目錄 //parse_ini_file函數(shù)作用,解析并獲取ini文件的參數(shù),加true是二維數(shù)組</span> <span style="color: #800080">$dbini</span> = <span style="color: #008080">parse_ini_file</span>(<span style="color: #800080">$file</span>,<span style="color: #0000ff">true</span><span style="color: #000000">); </span><span style="color: #800080">$driver</span> = <span style="color: #800080">$dbini</span>['database']['driver'<span style="color: #000000">]; </span><span style="color: #008000">//</span><span style="color: #008000">這里的數(shù)據(jù)庫(kù)是mysql的總數(shù)據(jù)庫(kù)</span> <span style="color: #800080">$dbname</span> = <span style="color: #800080">$dbini</span>['database']['dbname'<span style="color: #000000">]; </span><span style="color: #800080">$host</span> = <span style="color: #800080">$dbini</span>['database']['host'<span style="color: #000000">]; </span><span style="color: #800080">$port</span> = <span style="color: #800080">$dbini</span>['database']['port'<span style="color: #000000">]; </span><span style="color: #008000">//</span><span style="color: #008000">構(gòu)造PDO連接數(shù)據(jù)庫(kù)的第一個(gè)參數(shù),這個(gè)參數(shù)這么設(shè)置純屬是PDO類的語(yǔ)法,不懂的可以百度一下,這里就不做詳解了</span> <span style="color: #800080">$dsn</span> = <span style="color: #800080">$driver</span>.':'.'dbname='.<span style="color: #800080">$dbname</span>.';host='.<span style="color: #800080">$host</span>.';port='.<span style="color: #800080">$port</span><span style="color: #000000">; </span><span style="color: #008000">//</span><span style="color: #008000">其他連接數(shù)據(jù)庫(kù)參數(shù)</span> <span style="color: #800080">$username</span> = <span style="color: #800080">$dbini</span>['database']['username'<span style="color: #000000">]; </span><span style="color: #800080">$password</span> = <span style="color: #800080">$dbini</span>['database']['password'<span style="color: #000000">]; </span><span style="color: #800080">$options</span> = <span style="color: #800080">$dbini</span>['options'];<span style="color: #008000">//</span><span style="color: #008000">初始化設(shè)置PDO選項(xiàng)</span> <span style="color: #0000ff">try</span><span style="color: #000000">{ self</span>::<span style="color: #800080">$pdo</span> = <span style="color: #0000ff">new</span> PDO(<span style="color: #800080">$dsn</span>,<span style="color: #800080">$username</span>,<span style="color: #800080">$password</span>,<span style="color: #800080">$options</span><span style="color: #000000">); </span><span style="color: #008000">//</span><span style="color: #008000">設(shè)置PDO屬性。拋出錯(cuò)誤報(bào)告</span> self::<span style="color: #800080">$pdo</span>->setAttribute(PDO::ATTR_ERRMODE,PDO::<span style="color: #000000">ERRMODE_EXCEPTION); </span><span style="color: #0000ff">try</span><span style="color: #000000">{ </span><span style="color: #008000">//</span><span style="color: #008000">選擇商品數(shù)據(jù)表所在的數(shù)據(jù)庫(kù)</span> self::<span style="color: #800080">$pdo</span>-><span style="color: #008080">exec</span>('use queue'<span style="color: #000000">); }</span><span style="color: #0000ff">catch</span>(PDOException <span style="color: #800080">$e</span><span style="color: #000000">){ </span><span style="color: #0000ff">echo</span> <span style="color: #800080">$e</span>-><span style="color: #000000">getMessage(); } }</span><span style="color: #0000ff">catch</span>(PDOException <span style="color: #800080">$e</span><span style="color: #000000">){ </span><span style="color: #0000ff">echo</span> <span style="color: #800080">$e</span>-><span style="color: #000000">getMessage(); } } </span><span style="color: #008000">/*</span><span style="color: #008000"> *入列 *$data數(shù)組 *成功返回1,失敗返回false,或者null </span><span style="color: #008000">*/</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">function</span> _unshift(<span style="color: #800080">$data</span> =<span style="color: #0000ff">array</span><span style="color: #000000">()){ </span><span style="color: #0000ff">if</span>(!<span style="color: #008080">is_array</span>(<span style="color: #800080">$data</span>) || <span style="color: #0000ff">empty</span>(<span style="color: #800080">$data</span>)){<span style="color: #0000ff">return</span> <span style="color: #0000ff">false</span><span style="color: #000000">;} </span><span style="color: #800080">$sql</span> = 'default'<span style="color: #000000">; </span><span style="color: #0000ff">foreach</span>(<span style="color: #800080">$data</span> <span style="color: #0000ff">as</span> <span style="color: #800080">$k</span>=><span style="color: #800080">$v</span><span style="color: #000000">){ </span><span style="color: #800080">$sql</span> .= ',"'.<span style="color: #800080">$v</span>.'"'<span style="color: #000000">; } </span><span style="color: #008000">//</span><span style="color: #008000">把$data轉(zhuǎn)為sql語(yǔ)句,添加到隊(duì)列容器contain中</span> <span style="color: #800080">$sql</span> = 'insert into goods values('.<span style="color: #800080">$sql</span>.')'<span style="color: #000000">; </span><span style="color: #0000ff">return</span> @<span style="color: #008080">array_unshift</span>(self::<span style="color: #800080">$container</span>,<span style="color: #800080">$sql</span><span style="color: #000000">); } </span><span style="color: #008000">/*</span><span style="color: #008000"> *出列 *成功返回最后插入的數(shù)據(jù)id *失敗返回失敗信息 </span><span style="color: #008000">*/</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">function</span><span style="color: #000000"> _pop(){ </span><span style="color: #0000ff">try</span>{<span style="color: #008000">//</span><span style="color: #008000">獲取尾部的sql語(yǔ)句,出列</span> <span style="color: #800080">$sql</span> = <span style="color: #008080">array_pop</span>(self::<span style="color: #800080">$container</span><span style="color: #000000">); self</span>::<span style="color: #800080">$pdo</span>-><span style="color: #008080">exec</span>(<span style="color: #800080">$sql</span><span style="color: #000000">); </span><span style="color: #008000">//</span><span style="color: #008000">把剩余的容器值賦給中間變量</span> <span style="color: #800080">$middle</span> = self::<span style="color: #800080">$container</span><span style="color: #000000">; </span><span style="color: #008000">//</span><span style="color: #008000">判斷中間變量是否為空,不為空則繼續(xù)獲取容器尾部的數(shù)據(jù),繼續(xù)出列</span> <span style="color: #0000ff">while</span>(<span style="color: #800080">$middle</span><span style="color: #000000">){ </span><span style="color: #800080">$sql</span> = <span style="color: #008080">array_pop</span>(<span style="color: #800080">$middle</span><span style="color: #000000">); self</span>::<span style="color: #800080">$pdo</span>-><span style="color: #008080">exec</span>(<span style="color: #800080">$sql</span><span style="color: #000000">); </span><span style="color: #008000">//</span><span style="color: #008000">把數(shù)據(jù)再轉(zhuǎn)給容器,也就是轉(zhuǎn)給while循環(huán)外面的$middle,這樣才能實(shí)現(xiàn)循環(huán),讓容器里面的數(shù)據(jù)全部出列,插入到數(shù)據(jù)庫(kù)中</span> self::<span style="color: #800080">$container</span> = <span style="color: #800080">$middle</span><span style="color: #000000">; } </span><span style="color: #008000">//</span><span style="color: #008000">返回的是,最后插入的id,失敗是null</span> <span style="color: #0000ff">return</span> self::<span style="color: #800080">$pdo</span>-><span style="color: #000000">lastInsertId(); }</span><span style="color: #0000ff">catch</span>(PDOException <span style="color: #800080">$e</span><span style="color: #000000">){ </span><span style="color: #0000ff">return</span> <span style="color: #800080">$e</span>-><span style="color: #000000">getMessage(); } } </span><span style="color: #008000">//</span><span style="color: #008000">析構(gòu)函數(shù),對(duì)象回收時(shí)調(diào)用,通過它實(shí)現(xiàn)自動(dòng)讓容器數(shù)據(jù)入庫(kù)</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">function</span><span style="color: #000000"> __destruct(){ </span><span style="color: #008000">//</span><span style="color: #008000">當(dāng)對(duì)象被回收時(shí),判斷容器是否存在消息,假如存在,則調(diào)用_pop方法,把消息出列</span> <span style="color: #0000ff">if</span>(self::<span style="color: #800080">$container</span><span style="color: #000000">){ self</span>::<span style="color: #000000">_pop(); } } }</span>
下面是同一級(jí)目錄下調(diào)用這個(gè)類的文件的內(nèi)容,當(dāng)然,你也可以在上面那個(gè)queue類的下面調(diào)用_unshift方法實(shí)現(xiàn)消息隊(duì)列的操作
<span style="color: #000000">php </span><span style="color: #0000ff">include</span> './queue.php'<span style="color: #000000">; </span><span style="color: #0000ff">use</span> Home\Queue;<span style="color: #008000">//</span><span style="color: #008000">引入命名空間的Queue類</span> <span style="color: #800080">$ob</span> = <span style="color: #0000ff">new</span><span style="color: #000000"> Queue; </span><span style="color: #008000">//</span><span style="color: #008000">消息入列</span> <span style="color: #800080">$ob</span>->_unshift(<span style="color: #0000ff">array</span>('goodsname'=>'vivo手機(jī)8888','price'=>1120,'category_id'=>1,'sort'=>1,'description'=>'vivo品牌','remark'=>'好用'<span style="color: #000000">)); </span><span style="color: #800080">$ob</span>->_unshift(<span style="color: #0000ff">array</span>('goodsname'=>'小米手機(jī)888','price'=>1998,'category_id'=>1,'sort'=>1,'description'=>'小米品牌手機(jī)','remark'=>'國(guó)產(chǎn)好貨'<span style="color: #000000">)); </span><span style="color: #008000">//</span><span style="color: #008000">之所以打印出來(lái),完成是為了看看效果,至于,有沒有實(shí)現(xiàn)商品入庫(kù),你得去看看你的數(shù)據(jù)庫(kù)了,呵呵</span> <span style="color: #008080">var_dump</span>(Queue::<span style="color: #800080">$container</span>);
?

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版
神級(jí)代碼編輯軟件(SublimeText3)