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代码技巧的小结
Jun 02 PHP
PHP调用JAVA的WebService简单实例
Mar 11 PHP
php代码审计比较有意思的例子
May 07 PHP
PHP临时文件的安全性分析
Jul 04 PHP
php生成百度sitemap站点地图类函数实例
Oct 17 PHP
PHP向socket服务器收发数据的方法
Jan 24 PHP
php根据一个给定范围和步进生成数组的方法
Jun 19 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
yii2使用ajax返回json的实现方法
May 14 PHP
Zend Framework入门应用实例详解
Dec 11 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
Sep 13 PHP
Laravel相关的一些故障解决
Aug 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
ZF等常用php框架中存在的问题
2008/01/10 PHP
php实现两个数组相加的方法
2015/02/17 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
php格式文件打开的四种方法
2018/02/24 PHP
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
vue-cli项目中使用Mockjs详解
2018/05/14 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[02:03]风行者至宝清风环佩外观展示
2020/09/05 DOTA
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
常用python编程模板汇总
2016/02/12 Python
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
Django+Ajax+jQuery实现网页动态更新的实例
2018/05/28 Python
在django view中给form传入参数的例子
2019/07/19 Python
python多维数组分位数的求取方式
2020/03/03 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
Python中的Cookie模块如何使用
2020/06/04 Python
基于python 将列表作为参数传入函数时的测试与理解
2020/06/05 Python
Python如何发送与接收大型数组
2020/08/07 Python
python 基于opencv实现高斯平滑
2020/12/18 Python
如何查看python关键字
2021/01/17 Python
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
如何用JQuery进行表单验证
2013/05/29 面试题
全民健身日活动方案
2014/01/29 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
服装设计专业毕业生求职信
2014/04/09 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
未中标通知书
2015/04/17 职场文书
个人欠条范本
2015/07/03 职场文书
java如何实现socket连接方法封装
2021/09/25 Java/Android