用PHP逐行输出

时间:2011-05-26 10:00:04

标签: php line

在一个小应用程序中,我写的是,在安装阶段,用户必须在表单中输入有关MySQL连接的详细信息(服务器名称,数据库名称,用户名...)

我希望逐行显示在窗口中完成的测试和操作的结果,最终在每个测试之间暂停一小段时间,例如:

  

“连接服务器......”(2s)“ok”(2s)
  “连接数据库......”(2s)“ok”(2s)
  “创建表格......”(2s)“ok”
   ......等等。

我已经尝试过使用ob_start(),flush(),ob_flush()但它不起作用,因为我的网络服务器似乎缓冲了自己的php输出,所以脚本需要很长时间才能运行但是所有内容都打印在同一时间。

我在这里和谷歌搜索过,没有任何结果(可能没有正确的关键字)

你能指点我解决吗? 用Ajax可能会?

ericc

2 个答案:

答案 0 :(得分:1)

您是否在每次打印前都尝试过usleep()

修改

您可以使用usleep()使您的PHP脚本延迟执行,以便逐个查看文本,它可以替代在您的案例中使用缓冲。

mysql_connect() successfully -> print something -> usleep(300)
mysql_select_db() successfully -> print something -> usleep(300)

答案 1 :(得分:1)

这有多种解决方案,但完全禁用缓存并不容易实现 因为在服务器端有一些缓存,可以禁用,但浏览器也有很大的缓存。

要解决此问题,您可以选择以下几种方法:

  • 伪造它,显示基于静态javascript的“动画”并在完成时重定向。

  • 使用ajax,让安装脚本echo将结果发送到文本文件/ mysql数据库,并使用不同的php脚本按设定的时间间隔加载文本文件/数据库并显示新结果。

  • 使用最新的HTML5 / javascript流媒体API,这是完全适合这样的东西,然而,很难找到任何好的文档。

要禁用服务器端缓存,我使用以下代码:

@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
ob_implicit_flush(1);
header('Expires: Fri, 01 Jan 1990 00:00:00 GMT');
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Pragma: no-cache');
header('Connection: close');