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

我见过许多实现进度条的网络应用程序,但是,我的问题与非上传类型有关.

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

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

>备份脚本可以绕过它.
>存储一些临时数据,以便将存档附加到(如果可以进行存档追加).
>客户端脚本经常调用服务器的PHP来执行操作.

我的一般猜测(不是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美元主机.)这个脚本针对所有受众(将被公开),所以我对它将在哪个主机上没有权力. (这假设我不会责怪最终用户有一个坏主机.)

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

解决方法:

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

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

上一篇:(14)监控管理流式查询


下一篇:【DBCA -SILENT】静默安装如何启用归档模式