什么是消息队列,百度百科说,···消息队列····是在消息的传输过程中保存消息的容器。

  看着网上林林总总的文章,都说是为了应对高并发,处理数据量超级大的一种数据容器,也可以说是利用各种方式,先把数据存储在一个···容器···中,然后,再慢慢从这个容器中获取数据,实现·····异步操作数据库·····的方式,以便降低数据库的压力。

  不管消息队列是什么,个人姑且认为它就是一种存储数据的···容器···,就这么简单明了,呵呵,因为本人对消息队列这东西研究的比较肤浅。

  不过,在这里,我还是要卖弄一下一个个人的小实验代码,呵呵,假若下面的东西与消息队列相离太远,那么请看官可别见怪哦,因为我上面已经声明的很清楚了,本人对这东西还是不甚了解,只不过是工作之余卖弄一下‘文采’而已,所以,假如真有误解消息队列这个东西,我只能说声,请你指正我的错误,让笔者迷途知返。

  先给出连接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);

PDO和消息队列的一点个人理解的更多相关文章

  1. Kafka消息队列初识

    一.Kafka简介 1.1 什么是kafka kafka是一个分布式.高吞吐量.高扩展性的消息队列系统.kafka最初是由Linkedin公司开发的,后来在2010年贡献给了Apache基金会,成为了 ...

  2. 7月目标 socket , 一致性哈希算法 ; mongodb分片; 分布式消息队列; 中间件的使用场景

      分布式的基础:一致性哈希  路由算法的一致性hash http://www.jiacheo.org/blog/174 http://www.tuicool.com/articles/vQVbmai ...

  3. System V 消息队列 实例

    前言: 消息队列是消息的链接表,存放在内核中,并由消息队列标识符标识.我们将称消息队列为 “队列”,其标识符为“队列I D”.msgget创建一个新队列或打开一个存在的队列; msgsnd向队列末端添 ...

  4. 【转】快速理解Kafka分布式消息队列框架

     from:http://blog.csdn.net/colorant/article/details/12081909 快速理解Kafka分布式消息队列框架 标签: kafkamessage que ...

  5. 快速理解Kafka分布式消息队列框架

    作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ ==是什么 == 简单的说,K ...

  6. [转载] 快速理解Kafka分布式消息队列框架

    转载自http://blog.csdn.net/xiaolang85/article/details/18048631 ==是什么 == 简单的说,Kafka是由Linkedin开发的一个分布式的消息 ...

  7. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  8. 消息队列 MQ 入门理解

    功能特性: 应用场景: 消息队列 MQ 可应用于如下几个场景: 分布式事务 在传统的事务处理中,多个系统之间的交互耦合到一个事务中,响应时间长,影响系统可用性.引入分布式事务消息,交易系统和消息队列之 ...

  9. 深入浅出理解基于 Kafka 和 ZooKeeper 的分布式消息队列

    消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题.实现高性能,高可用,可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件. 本场 Chat 主要内容: Kafk ...

随机推荐

  1. Android中Input型输入设备驱动原理分析(一)

    转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...

  2. python多线程编程

    Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...

  3. android用户界面之Gallery3D学习资料汇总

    一.Gallery之根蒂根基教程1.Android Gallery与衍生BaseAdapter容器 http://www.apkbus.com/android-6249-1-1.html 2.Andr ...

  4. 反调试技术常用API,用来对付检测od和自动退出程序

    在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己.为了了解如何破解反调试技术 ...

  5. Ubuntu菜鸟入门(三)—— 无用软件卸载,wps等常用软件安装

    一  移除不需要的软件 sudo apt-get remove libreoffice-common sudo apt-get remove unity-webapps-common sudo apt ...

  6. 【centOS】账号管理

    一.认识/etc/passwd和/etc/shadow 1.passwd的构造 上图为passwd其中一个用户的用户信息,分别表示为[用户名][密码][UID][GID][注释][家目录][Shell ...

  7. jvm的垃圾回收原理

    什么是垃圾回收? 垃圾回收是Java中自动内存管理的另一种叫法.垃圾回收的目的是为程序保持尽可能多的可用堆(heap). JVM会删除堆上不再需要从堆引用的对象. 用一个例子解释垃圾回收? 比方说,下 ...

  8. 探索摸寻之XCode 快捷键

    注释/反注释 Command+/ 模拟器没有Home键 在模拟器的应用界面 Command+Shift+h 返回上一级 (1920,24寸显示器,因此不是分辨率问题)

  9. Ajax缓存解决办法(转载)

    项目有时要用一些Ajax的效果,因为比较简单,也就没有去用什么Ajax.NET之类的东西,手写代码也就实现了.. 第二天,有人向我报告错误:说是只有第一次读取的值正常,后面的值都不正常:我调试了一下 ...

  10. dede判断当前文章

    <li><a href="/info/info3.html"  class=s  >企业文化 </a></li><li> ...