1

我试图让我知道 PHP 脚本在执行过程中的位置的“加载消息”;为了做到这一点,我试图在整个过程中回显 HTML/javascript 标记,但在脚本的其余部分运行之前,没有一个回显正在执行。除了使用 AJAX 之外,还有什么办法可以解决这个问题,还是仅仅是野兽的本性?

4

4 回答 4

1

Ajax 听起来像是要走的路。使用一个请求启动大操作,并使用另一个请求定期轮询。

不过,值得注意的一件事是,如果您使用会话:PHP 的默认会话处理程序会在 session_start 上阻塞,因此您无法处理同一会话的两个请求。第二个将等到第一个会话关闭。如果您的轮询直到您的大操作完成后才返回响应,您将不得不解决这个问题。

如果操作真的很大,请考虑在后台而不是在请求期间运行它。您可以每隔一秒左右刷新一次进度页面。不是很优雅,但可能更容易实现。

于 2012-12-11T19:33:37.530 回答
0

您可以使用flushor ob_flush(在第一次开始使用 之后ob_start) - 但是不同的浏览器将以不同的方式处理发送给它们的早期内容。一条一直是正确的规则(我最近没有检查过)是大多数浏览器在收到一定数量的字节之前不会开始渲染任何东西。

现在,如您所知,有更好的方法可以做到这一点。阿贾克斯可能是最好的。但是,我在许多后端管理脚本中使用了这个系统,效果很好。基本上,首先请执行以下操作:

ob_start();
echo strpad('', 1024, ' ');
ob_flush();
echo '<script>updateProgress(0.1);</script>';ob_flush();
/// do something else
echo '<script>updateProgress(0.2);</script>';ob_flush();
/// do something else...
echo '<script>updateProgress(0.3);</script>';ob_flush();
于 2012-12-11T20:04:57.810 回答
0

我建议用 AJAX 做这两个请求。第一个请求将一直有效,直到工作完成。第二个请求将每隔几秒重复一次,从数据库中提取数据并以 JSON 格式回显进度,然后由 JavaScript 解析并更新进度。你甚至可以在上面做一些进度条!

于 2012-12-11T20:01:29.890 回答
0

您可以让脚本从您的服务器请求另一个文件,并在 GET 中传递信息。但我不会向任何人推荐这个。除了调试之外,它基本上没用。

这甚至无法使用 ajax 完成,因为 php 完全在服务器上执行。Ajax 请求是从用户的浏览器执行的。

完成此操作的另一种方法是在进行时进行 sql 插入。

编辑:如果您想要实时获取此信息。实现起来并不容易。您需要将我在上面发布的内容与 ajax 混合以在另一个页面中请求信息。

于 2012-12-11T19:30:32.300 回答