程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PDO和消息隊列的一點個人理解,pdo消息隊列

PDO和消息隊列的一點個人理解,pdo消息隊列

編輯:關於PHP編程

PDO和消息隊列的一點個人理解,pdo消息隊列


  什麼是消息隊列,百度百科說,···消息隊列····是在消息的傳輸過程中保存消息的容器。

  看著網上林林總總的文章,都說是為了應對高並發,處理數據量超級大的一種數據容器,也可以說是利用各種方式,先把數據存儲在一個···容器···中,然後,再慢慢從這個容器中獲取數據,實現·····異步操作數據庫·····的方式,以便降低數據庫的壓力。

  不管消息隊列是什麼,個人姑且認為它就是一種存儲數據的···容器···,就這麼簡單明了,呵呵,因為本人對消息隊列這東西研究的比較膚淺。

  不過,在這裡,我還是要賣弄一下一個個人的小實驗代碼,呵呵,假若下面的東西與消息隊列相離太遠,那麼請看官可別見怪哦,因為我上面已經聲明的很清楚了,本人對這東西還是不甚了解,只不過是工作之余賣弄一下‘文采’而已,所以,假如真有誤解消息隊列這個東西,我只能說聲,請你指正我的錯誤,讓筆者迷途知返。

  先給出連接mysql數據庫配置文件mysql.ini的內容:

[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

  數據表文件queue.sql的內容:

-- 消息隊列測試
-- 商品表
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,'美國入口貴重電子產品','請多多銷售'),(default,'宏基手提電腦1',4888,3,1,'價格劃算好電腦',null),(default,'f-30絨衣',200,2,1,'以純白色厚皮羽絨服',null),(default,'n-100鞋子',300,4,1,'Nick品牌',null);

  下面是簡單的消息隊列實現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;
    //構造函數實現初始化PDO連接數據庫
    public function __construct($file = './mysql.ini'){//mysql數據庫的配置文件,./mysql.ini與這個類是同一個目錄
        //parse_ini_file函數作用,解析並獲取ini文件的參數,加true是二維數組
        $dbini        = parse_ini_file($file,true);
        $driver        = $dbini['database']['driver'];
        //這裡的數據庫是mysql的總數據庫
        $dbname        = $dbini['database']['dbname'];
        $host        = $dbini['database']['host'];
        $port        = $dbini['database']['port'];
        //構造PDO連接數據庫的第一個參數,這個參數這麼設置純屬是PDO類的語法,不懂的可以百度一下,這裡就不做詳解了
        $dsn = $driver.':'.'dbname='.$dbname.';host='.$host.';port='.$port;
        //其他連接數據庫參數
        $username    = $dbini['database']['username'];
        $password    = $dbini['database']['password'];
        $options    = $dbini['options'];//初始化設置PDO選項
        try{
            self::$pdo = new PDO($dsn,$username,$password,$options);
            //設置PDO屬性。拋出錯誤報告
            self::$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
            try{
                //選擇商品數據表所在的數據庫
                self::$pdo->exec('use queue');
            }catch(PDOException $e){
                echo $e->getMessage();
            }
        }catch(PDOException $e){
            echo $e->getMessage();
        }
    }
    /*
    *入列
    *$data數組
    *成功返回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轉為sql語句,添加到隊列容器contain中
        $sql = 'insert into goods values('.$sql.')';
        return @array_unshift(self::$container,$sql);
    }
    /*
    *出列
    *成功返回最後插入的數據id
    *失敗返回失敗信息
    */
    private static function _pop(){
        try{//獲取尾部的sql語句,出列
            $sql = array_pop(self::$container);
            self::$pdo->exec($sql);
            //把剩余的容器值賦給中間變量
            $middle = self::$container;
            //判斷中間變量是否為空,不為空則繼續獲取容器尾部的數據,繼續出列
            while($middle){
                $sql = array_pop($middle);
                self::$pdo->exec($sql);
                //把數據再轉給容器,也就是轉給while循環外面的$middle,這樣才能實現循環,讓容器裡面的數據全部出列,插入到數據庫中
                self::$container = $middle;
            }
            //返回的是,最後插入的id,失敗是null
            return self::$pdo->lastInsertId();

            }catch(PDOException $e){
                return $e->getMessage();
            }
    }
    //析構函數,對象回收時調用,通過它實現自動讓容器數據入庫
    public function __destruct(){
        //當對象被回收時,判斷容器是否存在消息,假如存在,則調用_pop方法,把消息出列
        if(self::$container){
            self::_pop();
        }
    }
}

  下面是同一級目錄下調用這個類的文件的內容,當然,你也可以在上面那個queue類的下面調用_unshift方法實現消息隊列的操作

<?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'=>'國產好貨'));
//之所以打印出來,完成是為了看看效果,至於,有沒有實現商品入庫,你得去看看你的數據庫了,呵呵
var_dump(Queue::$container);

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved