2011-12-12 26 views
4

我见过很多实现进度条的web应用,但是,我的问题与非上传类有关。如何实现现代PHP Web应用程序的AJAX进度指示器?

许多PHP web应用程序(phpBB,Joomla等)都实现了一个“智能”安装程序,它不仅指导您完成软件的安装,还能让您了解当前正在执行的操作。例如,如果安装程序正在创建SQL表或编写配置文件,它会报告这一点而不要求您点击。 (基本上,坐下来放松安装。)

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

  1. 备份脚本能够绕过它。
  2. 存储了一些临时数据,以便将档案追加到(如果可以添加档案)。
  3. 客户端脚本经常调用服务器的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美元的主机)。这个脚本针对所有观众(将会公开),所以我无法控制它的主机。 (并且这假设我不会责怪最终用户有一个不好的主机。)

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

+0

注意:这些安装程序将要求您启用JavaScript以执行您所描述的任何幻想效果 - 如果您的应用正在执行的任务取决于JavaScript *,则取决于JavaScript *没有任何“讨厌”。人们会使用渐进式增强功能(只有在javascript可用时才添加功能)才能添加绝对可选的功能。在你给的例子中,AJAX调用轮询,更新页面,显示和隐藏进度条......所有这些都需要JavaScript,这很好。 –

+0

@Chris是的,当且仅当它依赖于Javascript。显然,漂亮的进度条(以及一般的任何进度显示)都需要AJAX。但是,如果用户根本没有Javascript呢?我的应用程序没有依赖于Javascript - 只是简单的HTML和CSS3。因此,我询问了长时间运行PHP脚本的另一个问题。 :)(我认为这是可能的更新sans Javascript与<元刷新,但不是非常确定。) –

回答

1

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

我不会推荐任何状态更新的直接I/O。你是正确的,它是混乱和效率低下。我会说$ _SESSION绝对是这里走的路。

+0

得到爱它时,有人标记了唯一的答案,没有提供一个替代的答案,甚至留下评论大声笑.... –

+0

(抓住他的斧头,听着巨魔的呼叫) –

+0

我不知道为什么它被拒绝了,但是...... $ _SESSION变量听起来不是一个坏主意!我认为这可能会起作用,但只涉及Javascript。我仍然坚持PHP执行的长度,以及它如何绕过它。尽管如此,+1对于这个问题的一些见解。 :) –

相关问题