PHP PDO和消息队列的个人理解与应用实例分析

吾爱主题 阅读:93 2021-09-18 16:22:00 评论:0

本文实例讲述了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.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容