普通网友 2016-12-07 13:50 采纳率: 0%
浏览 815

求解答,PHP里的 ob_flush和flush有什么区别?(急求!附赠答案奖励)

最近在学PHP,手里有个通过阿里云免费套餐活动开通的云服务器,想做个小项目。

最近遇到一个问题,就是ob_flush和flush的区别。它们在手册中有描述, 都是通过刷新输出缓冲区, 并且还需要配套使用, 对它们的不同感到有些迷惑。

比如:

ob_start();
echo 'aaa';
sleep(2);
echo "111";
ob_flush();

等待2秒会同时输出 aaa111 。然后下面的:

ob_start();
echo 'aaa';
ob_flush();
sleep(2);
echo "111";

则会立即输出 aaa,2秒后输出 111.

求解答!附赠阿里云免费套餐邀请码一个,能开云服务器数据库,很着急谢谢各位了。

  • 写回答

3条回答 默认 最新

  • @不在 2016-12-08 00:47
    关注

    他们俩的操作对象不同, 有些情况下, flush根本不做什么事情..

    ob_*系列函数, 是操作PHP本身的输出缓冲区.所以, ob_flush是刷新PHP自身的缓冲区.

    而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.

    在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针, 间接的调用apache的api: ap_rflush刷新apache的输出缓冲区, 当然手册中也说了, 有一些apache的其他模块, 可能会改变这个动作的结果..

    有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。

    甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 标记之前,不会显示出整个表格。

    一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。所以, 正确使用俩者的顺序是. 先ob_flush, 然后flush,

    当然, 在其他sapi下, 不调用flush也可以, 只不过为了保证你代码的可移植性, 建议配套使用.

    评论

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站