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 相关文章推荐
模仿OSO的论坛(五)
Oct 09 PHP
配置支持SSI
Nov 25 PHP
用php实现的获取网页中的图片并保存到本地的代码
Jan 05 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
Jun 14 PHP
php错误级别的设置方法
Jun 17 PHP
php获取百度收录、百度热词及百度快照的方法
Apr 02 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
Jul 29 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
Sep 23 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
Nov 10 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
Sep 15 PHP
PHP二维数组分页2种实现方法解析
Jul 09 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 23 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下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
php实现window平台的checkdnsrr函数
2015/05/27 PHP
PHP编写简单的App接口
2016/08/28 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
2012/08/14 Javascript
使用javascript实现页面定时跳转总结篇
2013/09/21 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
使用jquery实现仿百度自动补全特效
2015/07/23 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
JS控制HTML元素的显示和隐藏的两种方法
2016/09/27 Javascript
Javascript 判断两个IP是否在同一网段实例代码
2016/11/28 Javascript
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
Kickers鞋英国官网:男士、女士和儿童鞋
2021/03/08 全球购物
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
高级Java程序员面试题
2016/06/23 面试题
办护照工作证明范本
2014/01/14 职场文书
公司捐款倡议书
2014/05/14 职场文书
三严三实对照检查材料
2014/09/22 职场文书
民主评议党员自我鉴定
2014/10/21 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
送给客户微信问候语!
2019/07/04 职场文书
vue3中的组件间通信
2021/03/31 Vue.js
Redis实现分布式锁的五种方法详解
2022/06/14 Redis