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


Posted in PHP onNovember 25, 2019

本文实例讲述了PHP 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);

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 防注入函数(格式化数据)
Aug 08 PHP
PHP 输出URL的快捷方式示例代码
Sep 22 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
Aug 08 PHP
ThinkPHP调试模式与日志记录概述
Aug 22 PHP
在win7中搭建Linux+PHP 开发环境
Oct 08 PHP
php使用Jpgraph绘制柱形图的方法
Jun 10 PHP
php中Snoopy类用法实例
Jun 19 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
Jan 08 PHP
php封装的page分页类完整实例
Oct 18 PHP
ThinkPHP实现简单登陆功能
Apr 28 PHP
实现php删除链表中重复的结点
Sep 27 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 #PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 #PHP
使用Git实现Laravel项目的自动化部署
Nov 24 #PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 #PHP
laravel框架中视图的基本使用方法分析
Nov 23 #PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 #PHP
laravel框架中控制器的创建和使用方法分析
Nov 23 #PHP
You might like
php下使用SMTP发邮件的代码
2008/01/10 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
jquery可见性过滤选择器使用示例
2013/06/24 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
Express的路由详解
2015/12/10 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
nodejs 终端打印进度条实例代码
2017/04/22 NodeJs
浅谈Vue 初始化性能优化
2017/08/31 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
将jquery.qqFace.js表情转换成微信的字符码
2017/12/01 jQuery
antd Upload 文件上传的示例代码
2018/12/14 Javascript
微信小程序控制台提示warning:Now you can provide attr &quot;wx:key&quot; for a &quot;wx:for&quot; to improve performance解决方法
2019/02/21 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
pycharm远程调试openstack的图文教程
2017/11/21 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
机关驾驶员违规检讨书
2014/09/13 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
党支部四风整改方案
2014/10/25 职场文书
2019经典广告词集锦!
2019/07/02 职场文书
话题作文之呼唤
2019/12/18 职场文书
如何在CSS中绘制曲线图形及展示动画
2021/05/24 HTML / CSS