用PHP逐行输出

发布于 2024-11-09 13:15:30 字数 446 浏览 3 评论 0原文

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

我想逐行显示测试结果以及在窗口中完成的操作,最终在每个测试之间有一个小暂停,例如:

“连接到服务器...”(2s)“确定”(2s)
“连接到数据库...”(2s) “确定”(2s)
“创建表...”(2s)“确定”
....等等

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

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

你能指出解决方案吗?
用Ajax可能是?

埃里克

In a small application, I'm writing, during installation phase, the user must enter detail about the MySQL connection in a form (server name, database name, username ...)

I would like to display line by line the result of tests and actions done in a window, with eventually a small pause between each test, like :

"Connection to the server ..."(2s) "ok" (2s)
"Connection to the database ..."(2s) "ok" (2s)
"Creation of tables ..."(2s) "ok"
....etc

I have tried with ob_start(), flush(), ob_flush() but it doesn't work as my webserver seems to buffer itself the php output, so the script takes a long time to run but everything is printed at the same time.

I have searched here and with Google, without any result (may be not with the correct keywords)

Can you point me to solution ?
with Ajax may be ?

ericc

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

怕倦 2024-11-16 13:15:30

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

要解决此问题,您有几个选项:

  • 伪造它,显示基于静态 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');

There are multiple solutions to this, but disabling caching altogether isn't easily accomplished.
Because on the server side there is some caching, which can be disabled, but there is also a very large chance that the browser is caching as well.

To fix this you have a few options:

  • fake it, display a static javascript based "animation" and redirect when done.

  • Use ajax, let the installation script echo the results to a text file / mysql database and use a different php script to load the the text file / database at set intervals and display the new results.

  • Use the newest HTML5/javascript streaming API which is made exactly for stuff like this, it is, however, quite hard to find any good documentation on this.

To disable server side caching, I use this code:

@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');
爱*していゐ 2024-11-16 13:15:30

你在每次打印之前尝试过 usleep() 吗?

编辑

您可以使用 usleep() 使您的 php 脚本延迟执行,以便可以一张一张地看到文本,它可以在您的情况下替代缓冲的使用。

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

Have you tried usleep() before every time printing out?

Edit

You can use usleep() to make your php script delay the execution so that texts can be seen one by one, it could substitute the use of buffering IN YOUR CASE.

mysql_connect() successfully -> print something -> usleep(300)
mysql_select_db() successfully -> print something -> usleep(300)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文