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图片处理类 phpThumb参数用法介绍
Mar 11 PHP
PHP fopen 读取带中文URL地址的一点见解
Sep 25 PHP
深入array multisort排序原理的详解
Jun 18 PHP
php的dl函数用法实例
Nov 06 PHP
php实现refresh刷新页面批量导入数据的方法
Dec 23 PHP
php使用GD实现颜色渐变实例
Jun 02 PHP
PHP汉字转换拼音的函数代码
Dec 30 PHP
Yii2中添加全局函数的方法分析
May 04 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
分享5个非常有用的Laravel Blade指令
May 30 PHP
Laravel6.18.19如何优雅的切换发件账户
Jun 14 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中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
javascript复制对象使用说明
2011/06/28 Javascript
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
JavaScript中的ajax功能的概念和示例详解
2016/10/17 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
基于Vue实现图书管理功能
2017/10/17 Javascript
使用vue-cli编写vue插件的方法
2018/02/26 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
2019/10/30 Javascript
分析在Python中何种情况下需要使用断言
2015/04/01 Python
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
python 地图经纬度转换、纠偏的实例代码
2018/08/06 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
手写一个python迭代器过程详解
2019/08/27 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
2019/12/27 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
2020/12/07 Python
Html5页面二次分享的实现
2018/07/30 HTML / CSS
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
领导班子整改措施
2014/10/24 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android