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 相关文章推荐
php5中date()得出的时间为什么不是当前时间的解决方法
Jun 30 PHP
php求两个目录的相对路径示例(php获取相对路径)
Mar 27 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
Apr 21 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
Jun 26 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
Mar 07 PHP
php使用pdo连接sqlite3的配置示例
May 27 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
Mar 25 PHP
php xhprof使用实例详解
Apr 15 PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 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+mysql一个名片库程序
2006/10/09 PHP
PHP函数getenv简介和使用实例
2014/05/12 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
jquery.validate使用攻略 第二部
2010/07/01 Javascript
为JavaScript添加重载函数的辅助方法
2010/07/04 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
2015/03/23 Javascript
jQuery简单tab切换效果实现方法
2015/04/08 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
vue watch监听对象及对应值的变化详解
2018/02/24 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
Python缩进和冒号详解
2016/06/01 Python
Python max内置函数详细介绍
2016/11/17 Python
Python交互环境下实现输入代码
2018/06/22 Python
解决新django中的path不能使用正则表达式的问题
2018/12/18 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
keras-siamese用自己的数据集实现详解
2020/06/10 Python
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
竞选班长演讲稿
2013/12/30 职场文书
工作的心得体会
2013/12/31 职场文书
企业总经理岗位职责
2014/02/13 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
股东授权委托书范文
2014/09/13 职场文书
离婚代理词范文
2015/05/23 职场文书
预备党员半年考察意见
2015/06/01 职场文书