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 相关文章推荐
使用 php4 加速 web 传输
Oct 09 PHP
PHP防CC攻击实现代码
Dec 29 PHP
用PHP解决的一个栈的面试题
Jul 02 PHP
php中opendir函数用法实例
Nov 15 PHP
php中异常处理方法小结
Jan 09 PHP
PHP进程同步代码实例
Feb 12 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
Dec 19 PHP
PHP基于单例模式实现的mysql类
Jan 09 PHP
PHP+Apache+Mysql环境搭建教程
Aug 01 PHP
thinkPHP简单实现多个子查询语句的方法
Dec 05 PHP
基于PHP实现堆排序原理及实例详解
Jun 19 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
模仿OSO的论坛(四)
2006/10/09 PHP
PHP性能分析工具XHProf安装使用教程
2015/05/13 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
使用firebug进行调试javascript的示例
2013/12/16 Javascript
jQuery使用toggleClass方法动态添加删除Class样式的方法
2015/03/26 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
Bootstrap按钮组件详解
2016/04/26 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
2016/12/24 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
nodejs+mongodb aggregate级联查询操作示例
2018/03/17 NodeJs
解决vue-cli脚手架打包后vendor文件过大的问题
2018/09/27 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
vue-cli webpack配置文件分析
2019/05/20 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
python flask解析json数据不完整的解决方法
2019/05/26 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
Python中生成ndarray实例讲解
2021/02/22 Python
美国在线医疗分销商:MedEx Supply
2020/02/04 全球购物
演讲稿怎么写才完美
2014/01/02 职场文书
医院辞职信范文
2014/01/17 职场文书
庆元旦广播稿
2014/02/10 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
2015年出纳年终工作总结
2015/05/14 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL