博主热衷各种互联网技术,常啰嗦,时常伴有强迫症,常更新,觉得文章对你有帮助的可以关注我。 转载请注明"深蓝的镰刀"
1.遇到问题
不知你们有没有碰到过这样两种情况:
好吧,如果你碰到了以上两种情况,或者你将来可能会面临这样的问题,你可以mark一下,以便下次快速解决。
2.原理
立即学习“PHP免费学习笔记(深入)”;
言归正传。
下面隆重推出PHP输出控制之输出缓冲区
首先,试一下下面代码的效果
<?php
if (ob_get_level() == 0){ ob_start() }else{ exit(0);};//开始缓冲
for ($i = 0; $i<10; $i++){
echo "Line to show.\n<br />";//不直接输出,先存入缓冲区中
ob_flush();//将缓冲区的数据输出出来
flush();//将缓冲区的数据输出出来
sleep(2);//暂停两秒
}
echo "Done.";
ob_end_flush();//关闭并清理缓冲区
原理的话就是PHP在输出数据前先将数据放进缓冲(Buffer)里,等待需要时我们再将缓冲的数据输出出来,注意一下这里不要跟缓存(Cache)混淆。
这样做的好处一方面可以实现类似延迟加载的炫酷效果,一方面也能够降低服务器和客户端的压力,不然输出大数据时就会出现内存不够用的情况。
注:ob_flush()和flush()在用途上都是刷出缓冲区数据,但是官方建议配套使用,因为虽然在大部分WebServer下只用ob_flush()就能刷出缓冲,但是在某些情况下如apache中有时需要调用flush()才行,所以为了你代码的可移植性,建议看到ob_flush()立马在后面加上flush()。
既然知道了原理,我们来解决开头提到的两个问题。
3.解决百万数据单页面输出卡死的问题
<?php
ob_start();
$data = [1,2,3,4,5,6,7,8,9,10];//实际数据更多,为方便距离假设浏览器一次输出10条会卡死
$per = 3;//每次输出3条,可以改成1000
for ($i = 0;$i < count($data); $i+= $per){
for($j = $i; $j < $i + $per && $j <count($data); $j++){
echo $data[$j];
}
ob_flush();
flush();
sleep(2);
}
echo "Done.";
ob_end_flush();
4.解决header实现文件下载时文件过大导致卡死的问题
<?php
header('Content-type: application/txt');//输出类型
ob_start();
$data = "qwertyuioasdfghjkl";//文件内容,file_get_contents($file)
$per = 15;//每次输出15个字符,可以改成1000或更大
for ($i = 0;$i < strlen($data); $i+= $per){
for($j = $i; $j < $i + $per && $j <strlen($data); $j++){
echo $data[$j];
}
sleep(2);
ob_flush();
flush();
}
echo "Done.";
ob_end_flush(); 以上就介绍了PHP逐行输出数据并解决两种常见缓冲问题,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号