PHP PDO和消息隊(duì)列的個(gè)人理解與應(yīng)用實(shí)例分析
本文實(shí)例講述了PHP PDO和消息隊(duì)列的個(gè)人理解與應(yīng)用。分享給大家供大家參考,具體如下:
什么是消息隊(duì)列,百度百科說(shuō),···消息隊(duì)列····是在消息的傳輸過(guò)程中保存消息的容器。
看著網(wǎng)上林林總總的文章,都說(shuō)是為了應(yīng)對(duì)高并發(fā),處理數(shù)據(jù)量超級(jí)大的一種數(shù)據(jù)容器,也可以說(shuō)是利用各種方式,先把數(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ì)列這東西研究的比較膚淺。
不過(guò),在這里,我還是要賣(mài)弄一下一個(gè)個(gè)人的小實(shí)驗(yàn)代碼,呵呵,假若下面的東西與消息隊(duì)列相離太遠(yuǎn),那么請(qǐng)看官可別見(jiàn)怪哦,因?yàn)槲疑厦嬉呀?jīng)聲明的很清楚了,本人對(duì)這東西還是不甚了解,只不過(guò)是工作之余賣(mài)弄一下‘文采'而已,所以,假如真有誤解消息隊(duì)列這個(gè)東西,我只能說(shuō)聲,請(qǐng)你指正我的錯(cuò)誤,讓筆者迷途知返。
先給出連接mysql數(shù)據(jù)庫(kù)配置文件mysql.ini的內(nèi)容:
[database] driver = mysql host = 127.0.0.1 port = 3306 dbname = mysql username = root password = 1234 [options] PDO::MYSQL_ATTR_INIT_COMMAND = set names utf8
數(shù)據(jù)表文件queue.sql的內(nèi)容:
-- 消息隊(duì)列測(cè)試 -- 商品表 create table goods( id int unsigned primary key auto_increment, goodsname varchar(40) not null comment '商品名', price decimal(9,2) not null comment '價(jià)格', category_id tinyint unsigned not null comment '商品類(lèi)別id', sort tinyint comment '商品排序', description varchar(255) comment '商品描述', remark varchar(255) comment '備注' )engine InnoDB default charset=utf8; insert into goods values(default,'iPhone5s',5999,1,1,'美國(guó)入口貴重電子產(chǎn)品','請(qǐng)多多銷(xiāo)售'),(default,'宏基手提電腦1',4888,3,1,'價(jià)格劃算好電腦',null),(default,'f-30絨衣',200,2,1,'以純白色厚皮羽絨服',null),(default,'n-100鞋子',300,4,1,'Nick品牌',null);
下面是簡(jiǎn)單的消息隊(duì)列實(shí)現(xiàn)PDO商品入庫(kù)的代碼:
鄭重提醒:請(qǐng)認(rèn)真看我的注釋?zhuān)?qǐng)認(rèn)真看我的注釋?zhuān)?qǐng)認(rèn)真看我的注釋。重要的信息要說(shuō)三遍,呵呵!
<?php namespace Home; header('content-type:text/html;charset=utf-8;'); //引入PDO類(lèi) use \PDO; use \PDOStatement; use \PDOException; /*簡(jiǎn)單消息隊(duì)列*/ class Queue{ //容器可以是私有,最好是公有 static public $container=array(); //把PDO對(duì)象存放到屬性中是為了跨方法使用 static private $pdo; //構(gòu)造函數(shù)實(shí)現(xiàn)初始化PDO連接數(shù)據(jù)庫(kù) public function __construct($file = './mysql.ini'){//mysql數(shù)據(jù)庫(kù)的配置文件,./mysql.ini與這個(gè)類(lèi)是同一個(gè)目錄 //parse_ini_file函數(shù)作用,解析并獲取ini文件的參數(shù),加true是二維數(shù)組 $dbini = parse_ini_file($file,true); $driver = $dbini['database']['driver']; //這里的數(shù)據(jù)庫(kù)是mysql的總數(shù)據(jù)庫(kù) $dbname = $dbini['database']['dbname']; $host = $dbini['database']['host']; $port = $dbini['database']['port']; //構(gòu)造PDO連接數(shù)據(jù)庫(kù)的第一個(gè)參數(shù),這個(gè)參數(shù)這么設(shè)置純屬是PDO類(lèi)的語(yǔ)法,不懂的可以百度一下,這里就不做詳解了 $dsn = $driver.':'.'dbname='.$dbname.';host='.$host.';port='.$port; //其他連接數(shù)據(jù)庫(kù)參數(shù) $username = $dbini['database']['username']; $password = $dbini['database']['password']; $options = $dbini['options'];//初始化設(shè)置PDO選項(xiàng) try{ self::$pdo = new PDO($dsn,$username,$password,$options); //設(shè)置PDO屬性。拋出錯(cuò)誤報(bào)告 self::$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); try{ //選擇商品數(shù)據(jù)表所在的數(shù)據(jù)庫(kù) self::$pdo->exec('use queue'); }catch(PDOException $e){ echo $e->getMessage(); } }catch(PDOException $e){ echo $e->getMessage(); } } /* *入列 *$data數(shù)組 *成功返回1,失敗返回false,或者null */ public function _unshift($data =array()){ if(!is_array($data) || empty($data)){return false;} $sql = 'default'; foreach($data as $k=>$v){ $sql .= ',"'.$v.'"'; } //把$data轉(zhuǎn)為sql語(yǔ)句,添加到隊(duì)列容器contain中 $sql = 'insert into goods values('.$sql.')'; return @array_unshift(self::$container,$sql); } /* *出列 *成功返回最后插入的數(shù)據(jù)id *失敗返回失敗信息 */ private static function _pop(){ try{//獲取尾部的sql語(yǔ)句,出列 $sql = array_pop(self::$container); self::$pdo->exec($sql); //把剩余的容器值賦給中間變量 $middle = self::$container; //判斷中間變量是否為空,不為空則繼續(xù)獲取容器尾部的數(shù)據(jù),繼續(xù)出列 while($middle){ $sql = array_pop($middle); self::$pdo->exec($sql); //把數(shù)據(jù)再轉(zhuǎn)給容器,也就是轉(zhuǎn)給while循環(huán)外面的$middle,這樣才能實(shí)現(xiàn)循環(huán),讓容器里面的數(shù)據(jù)全部出列,插入到數(shù)據(jù)庫(kù)中 self::$container = $middle; } //返回的是,最后插入的id,失敗是null return self::$pdo->lastInsertId(); }catch(PDOException $e){ return $e->getMessage(); } } //析構(gòu)函數(shù),對(duì)象回收時(shí)調(diào)用,通過(guò)它實(shí)現(xiàn)自動(dòng)讓容器數(shù)據(jù)入庫(kù) public function __destruct(){ //當(dāng)對(duì)象被回收時(shí),判斷容器是否存在消息,假如存在,則調(diào)用_pop方法,把消息出列 if(self::$container){ self::_pop(); } } }
下面是同一級(jí)目錄下調(diào)用這個(gè)類(lèi)的文件的內(nèi)容,當(dāng)然,你也可以在上面那個(gè)queue類(lèi)的下面調(diào)用_unshift方法實(shí)現(xiàn)消息隊(duì)列的操作
<?php include './queue.php'; use Home\Queue;//引入命名空間的Queue類(lèi) $ob = new Queue; //消息入列 $ob->_unshift(array('goodsname'=>'vivo手機(jī)8888','price'=>1120,'category_id'=>1,'sort'=>1,'description'=>'vivo品牌','remark'=>'好用')); $ob->_unshift(array('goodsname'=>'小米手機(jī)888','price'=>1998,'category_id'=>1,'sort'=>1,'description'=>'小米品牌手機(jī)','remark'=>'國(guó)產(chǎn)好貨')); //之所以打印出來(lái),完成是為了看看效果,至于,有沒(méi)有實(shí)現(xiàn)商品入庫(kù),你得去看看你的數(shù)據(jù)庫(kù)了,呵呵 var_dump(Queue::$container);
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《PHP基于pdo操作數(shù)據(jù)庫(kù)技巧總結(jié)》、《php+mysqli數(shù)據(jù)庫(kù)程序設(shè)計(jì)技巧總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
微信公眾號(hào)點(diǎn)擊菜單即可打開(kāi)并登錄微站的實(shí)現(xiàn)方法
這篇文章主要介紹了微信公眾號(hào)點(diǎn)擊菜單即可打開(kāi)并登錄微站的實(shí)現(xiàn)方法,以實(shí)例形式對(duì)回調(diào)、菜單及參數(shù)的處理等具體實(shí)現(xiàn)步驟與功能代碼都做了較為詳細(xì)的描述,對(duì)于微信公眾號(hào)的開(kāi)發(fā)來(lái)說(shuō)具有很好的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-11php+mysql查詢(xún)實(shí)現(xiàn)無(wú)限下級(jí)分類(lèi)樹(shù)輸出示例
這篇文章主要介紹了php+mysql查詢(xún)實(shí)現(xiàn)無(wú)限下級(jí)分類(lèi)樹(shù)輸出,結(jié)合實(shí)例形式分析了php+MySQL查詢(xún)實(shí)現(xiàn)的樹(shù)狀分類(lèi)輸出功能,涉及php數(shù)據(jù)庫(kù)查詢(xún)與數(shù)組遍歷等相關(guān)操作技巧,需要的朋友可以參考下2016-10-10PHP中判斷文件存在使用is_file還是file_exists?
這篇文章主要介紹了PHP中判斷文件存在使用is_file還是file_exists?本文使用一個(gè)測(cè)試程序證明使用哪個(gè)函數(shù)比較好,需要的朋友可以參考下2015-04-04PHP獲取時(shí)間戳等相關(guān)函數(shù)匯總
PHP是一種廣泛使用的服務(wù)器端腳本語(yǔ)言,具有豐富的時(shí)間戳相關(guān)函數(shù)。本文介紹了PHP中獲取時(shí)間戳的常用函數(shù),包括time()、strtotime()、date()等,并提供了使用示例。同時(shí),還介紹了PHP中其他與時(shí)間相關(guān)的函數(shù),如mktime()、microtime()等。2023-06-06PHP JSAPI調(diào)支付API實(shí)現(xiàn)微信支付功能詳解
本人最近做了微信支付開(kāi)發(fā),是第一次接觸,其中走了很多彎路,遇到的問(wèn)題也很多。為了讓和我一樣的新人不再遇到類(lèi)似的問(wèn)題,我把我的開(kāi)發(fā)步驟和問(wèn)題寫(xiě)出來(lái)以供參考,這篇文章主要介紹了PHP JSAPI調(diào)支付API實(shí)現(xiàn)微信支付功能2022-11-11php基于curl實(shí)現(xiàn)的股票信息查詢(xún)類(lèi)實(shí)例
這篇文章主要介紹了php基于curl實(shí)現(xiàn)的股票信息查詢(xún)類(lèi),結(jié)合完整實(shí)例形式分析了php使用curl調(diào)用API接口實(shí)現(xiàn)股票信息查詢(xún)功能的相關(guān)操作技巧,需要的朋友可以參考下2016-11-11php實(shí)現(xiàn)用戶(hù)在線時(shí)間統(tǒng)計(jì)詳解
php實(shí)現(xiàn)用戶(hù)在線時(shí)間統(tǒng)計(jì)詳解,需要的朋友可以參考下。2011-10-10php讀取txt文件并將數(shù)據(jù)插入到數(shù)據(jù)庫(kù)
這篇文章主要介紹了php讀取txt文件并將數(shù)據(jù)插入到數(shù)據(jù)庫(kù)的方法和示例代碼,小文件大家可以參考第一種,大文件導(dǎo)入的話請(qǐng)參考第二種。2016-02-02