现代PHP Web应用程序如何实现AJAX进度指示器?

4
我看过很多实现进度条的Web应用程序,但是我的问题与非上传类型有关。
许多PHP Web应用程序(如phpBB、Joomla等)实现了“智能”安装程序,不仅可以引导您完成软件的安装,还可以告诉您它正在做什么。例如,如果安装程序正在创建SQL表或编写配置文件,则会报告此信息,而不需要要求您点击。(基本上,坐下来放松一下就可以安装。)
另一个很好的例子是Joomla的Akeeba Backup(以前是Joomla Pack)。当您备份Joomla安装时,它会创建安装目录的完整归档。然而,这需要很长时间,因此需要更新进度。但是,服务器本身对PHP脚本执行时间有限制,因此似乎要么:
1.备份脚本能够绕过它。 2.存储某些临时数据,以便追加归档(如果可能的话)。 3.客户端脚本每隔一段时间调用服务器的PHP执行操作。
我一般猜测(不特定于Akeeba)是#3:
Web页面JS -> POST foo/installer.php?doaction=1 SESSID=foo2 服务器 -> ERRCODE SUCCESS Web页面JS -> POST foo/installer.php?doaction=2 SESSID=foo2 服务器 -> ERRCODE SUCCESS Web页面JS -> POST foo/installer.php?doaction=3 SESSID=foo2 服务器 -> ERRCODE SUCCESS Web页面JS -> POST foo/installer.php?doaction=4 SESSID=foo2 服务器 -> ERRCODE FAIL Reason: Configuration.php not writable! Web页面JS -> Show error to user 我99%确定这不是事实,因为这会对用户启用JavaScript创建非常严重的依赖关系。
我的问题归结为以下几点:
1.长时间运行的PHP脚本(当然是在Web服务器上)如何处理,并能够“保持活动状态”超过PHP最大执行时间?如果它们没有“欺骗”,它们如何拆分手头的任务?(我注意到Akeeba Backup确实承认了PHP最大执行时间限制,但我不想深入挖掘此类代码。) 2.进度如何通过AJAX + PHP显示?我已经读到有人使用文件指示进度,但对我来说,这似乎很“肮脏”,并对I / O施加了一定的压力,特别是对于运行上述脚本的10,000多个访问者的实时服务器。
这个脚本的环境启用了safe_mode,并且通常限制为30秒。(基本上是一个限制性的免费$0主机。)这个脚本面向所有受众(将被公开),所以我无法控制它将在哪个主机上运行。(并且假设我不会责怪最终用户有一个糟糕的主机。)
我不一定需要代码示例(虽然非常感激!),我只需要知道实现此操作的逻辑流程。

请注意:这些安装程序需要启用JavaScript才能执行所描述的任何花哨效果-如果应用程序正在执行的任务取决于JavaScript,那么依赖JavaScript是没有什么“卑鄙”的。使用渐进增强(仅在JavaScript可用时添加功能)来添加绝对可选的功能。在您提供的示例中,轮询的AJAX调用、更新页面、显示和隐藏进度条等都需要JavaScript,这是可以接受的。 - Chris Baker
@Chris 是的,只有在它依赖于Javascript时才需要。显然,漂亮的进度条(以及任何进度显示)都需要AJAX。但是,如果用户根本没有Javascript怎么办?我的应用程序不依赖于Javascript - 只有简单的HTML和CSS3。因此,我问了另一个关于长时间运行的PHP脚本的问题。 :) (我认为可以使用<meta refresh>无需Javascript进行更新,但不是非常确定。) - Albert H
1个回答

1
通常,这种东西存储在 $_SESSION 变量中。至于执行超时,我通常会设置一个 JavaScript 超时器,每 x 秒将更新状态 div 的 innerHTML 设置为 PHP 脚本。当此脚本执行时,它不会“等待”或类似的操作。它仅仅从会话中获取当前状态(该状态通过实际执行安装的脚本更新),然后以我认为合适的任何花哨的方式输出(状态栏等)。
我不建议使用任何直接的 I/O 进行状态更新。你是正确的,这很混乱和低效。我认为 $_SESSION 绝对是这里应该采取的方法。

真是太棒了,有人将唯一的答案标记为错误,却没有提供替代答案甚至留下评论哈哈... - Kris Craig
(拿起他的斧头,倾听巨魔的召唤) - Kris Craig
我不知道为什么它被投票否决了,但是…… $_SESSION变量听起来并不是一个坏主意!我认为它可能会起作用,但只有在涉及JavaScript的情况下。我还卡在PHP执行长度上,以及如何绕过它。尽管如此,+1对问题的一些见解。 :) - Albert H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接