PHP PDO和消息队列的个人理解与应用实例分析
本文实例讲述了PHP PDO和消息队列的个人理解与应用。分享给大家供大家参考,具体如下:
什么是消息队列,百度百科说,···消息队列····是在消息的传输过程中保存消息的容器。
看着网上林林总总的文章,都说是为了应对高并发,处理数据量超级大的一种数据容器,也可以说是利用各种方式,先把数据存储在一个···容器···中,然后,再慢慢从这个容器中获取数据,实现·····异步操作数据库·····的方式,以便降低数据库的压力。
不管消息队列是什么,个人姑且认为它就是一种存储数据的···容器···,就这么简单明了,呵呵,因为本人对消息队列这东西研究的比较肤浅。
不过,在这里,我还是要卖弄一下一个个人的小实验代码,呵呵,假若下面的东西与消息队列相离太远,那么请看官可别见怪哦,因为我上面已经声明的很清楚了,本人对这东西还是不甚了解,只不过是工作之余卖弄一下‘文采'而已,所以,假如真有误解消息队列这个东西,我只能说声,请你指正我的错误,让笔者迷途知返。
先给出连接mysql数据库配置文件mysql.ini的内容:
?1 2 3 4 5 6 7 8 9 | [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的内容:
?1 2 3 4 5 6 7 8 9 10 11 12 | -- 消息队列测试 -- 商品表 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商品入库的代码:
郑重提醒:请认真看我的注释,请认真看我的注释,请认真看我的注释。重要的信息要说三遍,呵呵!
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | <?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方法实现消息队列的操作
?1 2 3 4 5 6 7 8 9 | <?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 ); |
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://www.cnblogs.com/loveyoume/p/6107239.html
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。