php中mysql操作buffer用法详解


Posted in PHP onMarch 19, 2015

本文实例讲述了php中mysql操作buffer用法。分享给大家供大家参考。具体分析如下:

php与mysql的连接有三种方式,mysql,mysqli,pdo。不管使用哪种方式进行连接,都有使用buffer和不使用buffer的区别。

什么叫使用buffer和不使用buffer呢?

客户端与mysql服务端进行查询操作,查询操作的时候如果获取的数据量比较大,那个这个查询结果放在哪里呢?

有两个地方可以放:客户端的缓冲区和服务端的缓冲区。

我们这里说的buffer指的是客户端的缓冲区,如果查询结果已经从服务端获取回来了,放置在了客户端的缓冲区,我们就称之为使用buffer。如果还是存放在服务端的缓冲区的话,我们就说没有使用buffer(unbuffer)。

使用buffer和不使用buffer有什么区别?

主要在内存方面,使用buffer会增加客户端的内存压力,当返回的数据结果特别大的时候可能会占用调用客户端(实际就是一个php进程)比较大的进程。不使用buffer自然对服务端(这里说的是提供mysql服务的服务器)压力更大。

具体可以参考:PHP查询MySQL大量数据的内存占用分析

php中三种模式是如何设置是否使用buffer的?

mysql默认的query是使用buffer的,而不使用buffer就需要使用mysql_unbuffer_query

mysqli默认的query是不使用buffer的,要使用buffer就需要设置MYSQLI_STORE_RESULT

pdo默认的quey是不使用buffer的,要使用buffer就需要设置MYSQL_ATTR_USE_BUFFERED_QUERY

大致相关代码如下:

<?php
$dbConfig = array(
  'host' => '10.128.11.101',
  'port' => '3306',
  'user' => 'test',
  'pass' => 'test',
  'db' => 'test',
);
$sql = 'select * from so_topic_app';
//---------mysql----------//
$db = mysql_connect($dbConfig['host'], $dbConfig['user'], $dbConfig['pass']);
mysql_select_db($dbConfig['db'], $db);
mysql_set_charset('utf8', $db);
// mysql使用buffer
$res = mysql_query($sql, $db);
$data = array();
while($row = mysql_fetch_row($res)) {
  $data[] = $row;
}
// mysql不使用buffer
$res = mysql_unbuffered_query($sql, $db);
$data = array();
while($row = mysql_fetch_row($res)) {
  $data[] = $row;
}
mysql_close($db);
//---------mysqli----------//
$db = mysqli_connect($dbConfig['host'], $dbConfig['user'], $dbConfig['pass'], $dbConfig['db']);
// mysqli不使用buffer
$result = mysqli_query($db, $sql);
$data = array();
while($row = $result->fetch_array()) {
  $data[] = $row;
}
// mysqli使用buffer
$result = mysqli_query($db, $sql, MYSQLI_STORE_RESULT);
$data = array();
while($row = $result->fetch_array()) {
  $data[] = $row;
}
mysqli_free_result($result);
mysqli_close($db);
//---------pdo----------//
$dsn = "mysql:dbname={$dbConfig['db']};host={$dbConfig['host']}";
$pdo = new PDO($dsn, $dbConfig['user'], $dbConfig['pass']);
// pdo不使用buffer
$stmt = $pdo->prepare($sql);
$stmt->execute();
$data = array();
$data = $stmt->fetchAll();
// pdo使用buffer
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$stmt = $pdo->prepare($sql);
$stmt->execute();
$data = array();
$data = $stmt->fetchAll();

后续

当然如果数据量非常大的话,大部分人还是会考虑使用分批次来提取和处理数据。所以实际上需要我们关注和使用mysql是使用buffer还是不使用buffer的场景非常少。

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

PHP 相关文章推荐
如何开发一个虚拟域名系统
Oct 09 PHP
PHP读写文件的方法(生成HTML)
Nov 27 PHP
[原创]效率较高的php下读取文本文件的代码
Jul 02 PHP
用PHP实现读取和编写XML DOM代码
Apr 07 PHP
php获取后台Job管理的实现代码
Jun 10 PHP
CodeIgniter使用phpcms模板引擎
Nov 12 PHP
ThinkPHP提交表单时默认自动转义的解决方法
Nov 25 PHP
smarty模板判断数组为空的方法
Jun 10 PHP
yii,CI,yaf框架+smarty模板使用方法
Dec 29 PHP
汇总PHPmailer群发Gmail的常见问题
Feb 24 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
May 20 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
PHP经典面试题集锦
Mar 19 #PHP
PHP将进程作为守护进程的方法
Mar 19 #PHP
PHP的pcntl多进程用法实例
Mar 19 #PHP
php安装swoole扩展的方法
Mar 19 #PHP
php清除和销毁session的方法分析
Mar 19 #PHP
Codeigniter发送邮件的方法
Mar 19 #PHP
Codeigniter实现发送带附件的邮件
Mar 19 #PHP
You might like
PHP的ASP防火墙
2006/10/09 PHP
PHP的分页功能
2007/03/21 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
2016/01/05 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
AngularJS国际化详解及示例代码
2016/08/18 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
vue 出现data-v-xxx的原因及解决
2020/08/04 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
整理Python 常用string函数(收藏)
2016/05/30 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
python用match()函数爬数据方法详解
2019/07/23 Python
python爬取王者荣耀全皮肤的简单实现代码
2020/01/31 Python
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
美国波西米亚风格精品店:South Moon Under
2019/10/26 全球购物
优秀员工自荐书范文
2013/12/08 职场文书
红旗团支部事迹材料
2014/01/27 职场文书
产品生产计划书
2014/05/07 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
领导工作表现评语
2015/01/04 职场文书
“爱眼护眼,提前预防近视”倡议书3篇
2019/10/30 职场文书