本文實例講述了PHP PDO和消息隊列的個人理解與應用。分享給大家供大家參考,具體如下:
什么是消息隊列,百度百科說,···消息隊列····是在消息的傳輸過程中保存消息的容器。
看著網(wǎng)上林林總總的文章,都說是為了應對高并發(fā),處理數(shù)據(jù)量超級大的一種數(shù)據(jù)容器,也可以說是利用各種方式,先把數(shù)據(jù)存儲在一個···容器···中,然后,再慢慢從這個容器中獲取數(shù)據(jù),實現(xiàn)·····異步操作數(shù)據(jù)庫·····的方式,以便降低數(shù)據(jù)庫的壓力。
不管消息隊列是什么,個人姑且認為它就是一種存儲數(shù)據(jù)的···容器···,就這么簡單明了,呵呵,因為本人對消息隊列這東西研究的比較膚淺。
不過,在這里,我還是要賣弄一下一個個人的小實驗代碼,呵呵,假若下面的東西與消息隊列相離太遠,那么請看官可別見怪哦,因為我上面已經(jīng)聲明的很清楚了,本人對這東西還是不甚了解,只不過是工作之余賣弄一下‘文采'而已,所以,假如真有誤解消息隊列這個東西,我只能說聲,請你指正我的錯誤,讓筆者迷途知返。
先給出連接mysql數(shù)據(jù)庫配置文件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)容:
-- 消息隊列測試
-- 商品表
create table goods(
id int unsigned primary key auto_increment,
goodsname varchar(40) not null comment '商品名',
price decimal(9,2) not null comment '價格',
category_id tinyint unsigned not null comment '商品類別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,'美國入口貴重電子產(chǎn)品','請多多銷售'),(default,'宏基手提電腦1',4888,3,1,'價格劃算好電腦',null),(default,'f-30絨衣',200,2,1,'以純白色厚皮羽絨服',null),(default,'n-100鞋子',300,4,1,'Nick品牌',null);
下面是簡單的消息隊列實現(xiàn)PDO商品入庫的代碼:
鄭重提醒:請認真看我的注釋,請認真看我的注釋,請認真看我的注釋。重要的信息要說三遍,呵呵!
?php
namespace Home;
header('content-type:text/html;charset=utf-8;');
//引入PDO類
use \PDO;
use \PDOStatement;
use \PDOException;
/*簡單消息隊列*/
class Queue{
//容器可以是私有,最好是公有
static public $container=array();
//把PDO對象存放到屬性中是為了跨方法使用
static private $pdo;
//構(gòu)造函數(shù)實現(xiàn)初始化PDO連接數(shù)據(jù)庫
public function __construct($file = './mysql.ini'){//mysql數(shù)據(jù)庫的配置文件,./mysql.ini與這個類是同一個目錄
//parse_ini_file函數(shù)作用,解析并獲取ini文件的參數(shù),加true是二維數(shù)組
$dbini = parse_ini_file($file,true);
$driver = $dbini['database']['driver'];
//這里的數(shù)據(jù)庫是mysql的總數(shù)據(jù)庫
$dbname = $dbini['database']['dbname'];
$host = $dbini['database']['host'];
$port = $dbini['database']['port'];
//構(gòu)造PDO連接數(shù)據(jù)庫的第一個參數(shù),這個參數(shù)這么設(shè)置純屬是PDO類的語法,不懂的可以百度一下,這里就不做詳解了
$dsn = $driver.':'.'dbname='.$dbname.';host='.$host.';port='.$port;
//其他連接數(shù)據(jù)庫參數(shù)
$username = $dbini['database']['username'];
$password = $dbini['database']['password'];
$options = $dbini['options'];//初始化設(shè)置PDO選項
try{
self::$pdo = new PDO($dsn,$username,$password,$options);
//設(shè)置PDO屬性。拋出錯誤報告
self::$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
try{
//選擇商品數(shù)據(jù)表所在的數(shù)據(jù)庫
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語句,添加到隊列容器contain中
$sql = 'insert into goods values('.$sql.')';
return @array_unshift(self::$container,$sql);
}
/*
*出列
*成功返回最后插入的數(shù)據(jù)id
*失敗返回失敗信息
*/
private static function _pop(){
try{//獲取尾部的sql語句,出列
$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,這樣才能實現(xiàn)循環(huán),讓容器里面的數(shù)據(jù)全部出列,插入到數(shù)據(jù)庫中
self::$container = $middle;
}
//返回的是,最后插入的id,失敗是null
return self::$pdo->lastInsertId();
}catch(PDOException $e){
return $e->getMessage();
}
}
//析構(gòu)函數(shù),對象回收時調(diào)用,通過它實現(xiàn)自動讓容器數(shù)據(jù)入庫
public function __destruct(){
//當對象被回收時,判斷容器是否存在消息,假如存在,則調(diào)用_pop方法,把消息出列
if(self::$container){
self::_pop();
}
}
}
下面是同一級目錄下調(diào)用這個類的文件的內(nèi)容,當然,你也可以在上面那個queue類的下面調(diào)用_unshift方法實現(xiàn)消息隊列的操作
?php
include './queue.php';
use Home\Queue;//引入命名空間的Queue類
$ob = new Queue;
//消息入列
$ob->_unshift(array('goodsname'=>'vivo手機8888','price'=>1120,'category_id'=>1,'sort'=>1,'description'=>'vivo品牌','remark'=>'好用'));
$ob->_unshift(array('goodsname'=>'小米手機888','price'=>1998,'category_id'=>1,'sort'=>1,'description'=>'小米品牌手機','remark'=>'國產(chǎn)好貨'));
//之所以打印出來,完成是為了看看效果,至于,有沒有實現(xiàn)商品入庫,你得去看看你的數(shù)據(jù)庫了,呵呵
var_dump(Queue::$container);
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP基于pdo操作數(shù)據(jù)庫技巧總結(jié)》、《php+mysqli數(shù)據(jù)庫程序設(shè)計技巧總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計有所幫助。
您可能感興趣的文章:- PHP PDO預處理語句及事務的使用
- PHP如何初始化PDO及原始SQL語句操作
- PHP中PDO關(guān)閉連接的方法問題
- PHP使用PDO 連接與連接管理操作實例分析
- php+pdo實現(xiàn)的購物車類完整示例
- PHP使用PDO實現(xiàn)mysql防注入功能詳解
- php pdo連接數(shù)據(jù)庫操作示例
- PHP連接MySQL數(shù)據(jù)庫的三種方式實例分析【mysql、mysqli、pdo】
- PHP使用PDO創(chuàng)建MySQL數(shù)據(jù)庫、表及插入多條數(shù)據(jù)操作示例
- php如何用PDO操作大數(shù)據(jù)對象