我正在尝试使用各种“加载消息”让我知道PHP脚本在执行过程中的位置;为了做到这一点,我试图在整个过程中回显HTML / javascript标记,但是在脚本的其余部分运行之前,没有任何回声正在执行。除了使用AJAX之外,还有什么方法可以解决这个问题,还是仅仅是野兽的本性?
答案 0 :(得分:1)
Ajax听起来像是要走的路。使用一个请求启动大操作,并使用另一个请求定期轮询。
但值得注意的是,如果您正在使用会话:PHP的默认会话处理程序会阻塞session_start,因此您无法处理同一会话的两个请求。第二个将等到第一个会话关闭。如果您的轮询在大型操作完成之后没有返回响应,那么您将不得不解决此问题。
如果操作非常大,请考虑在后台而不是在请求期间运行它。您可以每隔一秒左右刷新一次进度页面。不是很优雅,但可能更容易实现。
答案 1 :(得分:0)
您可以让脚本从您的服务器请求另一个文件,并在GET中传递信息。但我不会向任何人推荐这个。除了调试之外,它基本上没用。
这甚至不能使用ajax来完成,因为php完全在服务器上执行。 Ajax请求是从用户的浏览器执行的。
实现此目的的另一种方法是在进行时插入sql。
编辑:如果您想要实时获取此信息。完成并不容易。您需要将上面发布的内容与ajax混合在一起请求另一页中的信息。
答案 2 :(得分:0)
我建议用AJAX做两个请求。第一个请求将一直有效,直到工作完成。第二个请求将每隔几秒重复一次,从数据库中提取数据并回显JSON中的进度,然后由JavaScript解析并更新进度。你甚至可以在其上做一些进度条!
答案 3 :(得分:0)
您可以使用flush
或ob_flush
(首次使用ob_start
开始之后) - 但不同的浏览器会处理以不同方式发送给他们的早期内容。一直以来都是如此的规则(我最近没有检查过)是大多数浏览器在收到一定数量的字节之前不会开始渲染任何内容。
现在,正如您所知,有更好的方法可以做到这一点。 Ajax可能是最好的。但是我在许多后端管理脚本中使用了这个系统,它运行良好。基本上,首先要执行以下操作:
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();