大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本文实例讲述了php中mysql操作buffer用法。分享给大家供大家参考。具体分析如下:
成都创新互联公司于2013年成立,先为东乡等服务建站,东乡等地企业,进行企业商务咨询服务。为东乡企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
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程序设计有所帮助。
不知阁下需要的是怎样的缓存?纯客户端?还是怎样的,以下可供参考:
一:储存于客户端的信息,页面调用时无需从服务器解析直接使用(常见的即为Cookie,还有HTML5里的localStorage,Application Cache);
二:离线性质,即用户不在线时,也可以正常访问网页,所访问的数据即客户端储存的缓存(HTML5中的应用程序缓存,即Application Cache);
三:客户端与服务端共同缓存的,这种方法可使已经从数据库查询的数据、已通过程序计算得到的数据存于服务器,服务器解析时直接调用,无需再处理得到,大大减轻了服务器的压力(常见的即为session,HTML5中为sessionStorage);
四:纯服务端,同三,即将服务器已经处理好的数据暂存于服务器,需要时直接调用而无需再次处理以便提高效率和减轻服务器压力(服务器端的缓存机制非常多,网站开发者基本都会);
ob_get_contents, ob_end_clean从实现上应该是ob_get_clean的分解步骤。后者因为从c代码层面的整合,在仅单次执行时,速度上应该有微量的优势。因为优势远比网络IO的延迟要小,几乎可以忽略吧。
echo ob_get_contents应该也一般是用于首次生成模板缓存。是内存操作。
include用于直接显示。是文件操作。
显示模板可以用后者,做缓存所节约的时间主要是处理计算和各媒介之间的IO上的,根据自己的应用和自己的设备环境在慢的、瓶颈部分作出调整,是灵活的。没有定式。
首先你找到php 的配置文件php.ini
1.php.ini中的output_buffering配置
Off: 表示关闭PHP输出缓存
On: 打开无限大的输出缓存
4096: 打开大小为4096Byte的输出缓存
2.php.ini中的implicit_flush配置
On: 表示每次输出(如echo,print)后自动调用flush()函数后,直接输出
Off: 与On相反,每次输出后不会调用flush(),需要等到server buffering满了才会输出,但是我们可以用flush()函数代替它,不开启也没关系,反而更加灵活
3.ob_flush()函数: 取出PHP buffering中的数据,放入server buffering
4.flush()函数: 取出Server buffering的数据,放入browser buffering
5.ob_start()函数:对于这个函数我现在了解的不是很清楚,因为开启后输出就会不受ob_flush()控制,即使使用ob_flush()和flush(),数据也不能立即输出在浏览器上.现在知道的是,如果output_buffering=Off,即使使用了ob_start(),也是无法将输出数据缓存的,而如果output_buffering=On的话,即使不用ob_start(),输出数据也可以被PHP缓存,所以觉得ob_start比较废,暂时不管他
然后我们来看代码吧(设置output_buffering=4096,implicit_flush=Off)
最后的打印效果是
每隔一秒输出一个
html
body
?php
// ob_start(); //这玩意开了就会不正常,输出不受ob_flush()控制,不知道到底干嘛用
// echo str_repeat(' ' ,1000); //IE缓存256Bytes
echo str_repeat(' ' ,1000); //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了
for($i=0;$i5;$i++) {
echo $i.'br /';
ob_flush();
flush();
sleep(1);
}
?
/body
/html
至于你的可以这么写
?php
echo str_repeat(' ' ,1000);
echo 'abr/';
ob_flush();
flush();
sleep(3);
echo 'bbr/';
?