php拿到缓冲区的数据 php拿到缓冲区的数据怎么处理

php中mysql操作buffer用法详解

本文实例讲述了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程序设计有所帮助。

PHP 能将数据入浏览器缓存吗?如果能求讲解!

不知阁下需要的是怎样的缓存?纯客户端?还是怎样的,以下可供参考:

一:储存于客户端的信息,页面调用时无需从服务器解析直接使用(常见的即为Cookie,还有HTML5里的localStorage,Application Cache);

二:离线性质,即用户不在线时,也可以正常访问网页,所访问的数据即客户端储存的缓存(HTML5中的应用程序缓存,即Application Cache);

三:客户端与服务端共同缓存的,这种方法可使已经从数据库查询的数据、已通过程序计算得到的数据存于服务器,服务器解析时直接调用,无需再处理得到,大大减轻了服务器的压力(常见的即为session,HTML5中为sessionStorage);

四:纯服务端,同三,即将服务器已经处理好的数据暂存于服务器,需要时直接调用而无需再次处理以便提高效率和减轻服务器压力(服务器端的缓存机制非常多,网站开发者基本都会);

php缓存技术比较!!!

ob_get_contents, ob_end_clean从实现上应该是ob_get_clean的分解步骤。后者因为从c代码层面的整合,在仅单次执行时,速度上应该有微量的优势。因为优势远比网络IO的延迟要小,几乎可以忽略吧。

echo ob_get_contents应该也一般是用于首次生成模板缓存。是内存操作。

include用于直接显示。是文件操作。

显示模板可以用后者,做缓存所节约的时间主要是处理计算和各媒介之间的IO上的,根据自己的应用和自己的设备环境在慢的、瓶颈部分作出调整,是灵活的。没有定式。

求教php 缓冲区问题

首先你找到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/';

?


分享文章:php拿到缓冲区的数据 php拿到缓冲区的数据怎么处理
转载注明:http://pwwzsj.com/article/hgcdeg.html