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

时间:2011-12-12 20:43:40

标签: php javascript ajax progress

我见过很多实现进度条的网页应用,不过,我的问题与非上传类型有关。

许多PHP Web应用程序(phpBB,Joomla等)实现了一个“智能”安装程序,不仅可以指导您完成软件的安装,还可以让您了解它当前正在做什么。例如,如果安装程序正在创建SQL表或编写配置文件,它将报告此情况而不要求您单击。 (基本上,坐下来放松安装。)

另一个很好的例子是Joomla的Akeeba Backup(以前的Joomla Pack)。当您执行Joomla安装的备份时,它会创建安装目录的完整存档。然而,这需要很长时间,因此需要更新进度。但是,服务器本身对PHP脚本执行时间有限制,因此似乎要么

  1. 备份脚本可以绕过它。
  2. 存储一些临时数据,以便附加存档(如果可以附加存档)。
  3. 客户端脚本经常调用服务器的PHP来执行操作。
  4. 我的一般猜测(不是Akeeba特有的)是#3,即:

    Web page JS -> POST foo/installer.php?doaction=1 SESSID=foo2
    Server -> ERRCODE SUCCESS
    Web page JS -> POST foo/installer.php?doaction=2 SESSID=foo2
    Server -> ERRCODE SUCCESS
    Web page JS -> POST foo/installer.php?doaction=3 SESSID=foo2
    Server -> ERRCODE SUCCESS
    Web page JS -> POST foo/installer.php?doaction=4 SESSID=foo2
    Server -> ERRCODE FAIL Reason: Configuration.php not writable!
    Web page JS -> Show error to user
    

    我99%肯定不是这种情况,因为这会对用户产生非常讨厌的依赖关系以启用Javascript。

    我想我的问题归结为以下几点:

    • 如何处理长时间运行的PHP脚本(当然是在Web服务器上)并且能够“保持活跃”超过PHP最长执行时间?如果他们不“欺骗”,他们如何能够将任务分开? (我注意到Akeeba Backup确实承认了PHP的最大执行时间限制,但我不想深入挖掘这些代码。)
    • 如何通过AJAX + PHP显示进度?我读过人们使用文件来表示进度,但对我来说这看起来很“脏”,给I / O带来了一点压力,特别是对于运行上述脚本的10,000多名访客的实时服务器。

    此脚本的环境是启用safe_mode的位置,限制通常为30秒。 (基本上是一个限制性的,免费的0美元主机。)这个脚本针对所有受众(将被公开),所以我对它将在哪个主机上没有权力。 (这假设我不会责怪最终用户有一个坏主人。)

    我不一定需要代码示例(虽然非常感谢!),我只需要知道实现它的逻辑流程。

1 个答案:

答案 0 :(得分:1)

通常,这种东西存储在$ _SESSION变量中。就执行超时而言,我通常做的是有一个JavaScript超时,它将每个x秒的更新状态div的innerHTML设置为PHP脚本。当这个脚本执行时,它不会“等待”或类似的东西。它只是从会话中获取当前状态(通过正在执行安装的脚本更新)然后以我认为合适的任何花哨方法输出(状态栏等)。

我不建议任何直接I / O进行状态更新。你是对的,它是凌乱和低效的。我会说$ _SESSION绝对是去这里的方式。