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 相关文章推荐
php trim 去除空字符的定义与语法介绍
May 31 PHP
php下删除一篇文章生成的多个静态页面
Aug 08 PHP
PHP基础学习小结
Apr 17 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
Sep 30 PHP
PHP中替换键名的简易方法示例详解
Jan 07 PHP
根据ip调用新浪api获取城市名并转成拼音
Mar 07 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
Jul 08 PHP
2个Codeigniter文件批量上传控制器写法例子
Jul 25 PHP
php生成PDF格式文件并且加密
Jun 22 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
Aug 11 PHP
thinkPHP5实现数据库添加内容的方法
Oct 25 PHP
PHP实现UTF8二进制及明文字符串的转化功能示例
Nov 20 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
我的论坛源代码(十)
2006/10/09 PHP
基于PHP array数组的教程详解
2013/06/05 PHP
php计算年龄精准到年月日
2015/11/17 PHP
php表单处理操作
2017/11/16 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
JS window.opener返回父页面的应用
2009/10/24 Javascript
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
2018/01/10 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
vue的全局变量和全局拦截请求器的示例代码
2018/09/13 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
Python中用Spark模块的使用教程
2015/04/13 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
详解python解压压缩包的五种方法
2019/07/05 Python
python mysql中in参数化说明
2020/06/05 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
职专应届生求职信
2013/11/16 职场文书
党建示范点实施方案
2014/03/12 职场文书
旅游专业毕业生自荐书
2014/06/30 职场文书
村安全生产责任书
2014/08/25 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技