我见过很多实现进度条的web应用,但是,我的问题与非上传类有关。如何实现现代PHP Web应用程序的AJAX进度指示器?
许多PHP web应用程序(phpBB,Joomla等)都实现了一个“智能”安装程序,它不仅指导您完成软件的安装,还能让您了解当前正在执行的操作。例如,如果安装程序正在创建SQL表或编写配置文件,它会报告这一点而不要求您点击。 (基本上,坐下来放松安装。)
另一个很好的例子是与Joomla的Akeeba备份(以前的Joomla包)。当您执行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美元的主机)。这个脚本针对所有观众(将会公开),所以我无法控制它的主机。 (并且这假设我不会责怪最终用户有一个不好的主机。)
我不一定需要代码示例(虽然他们非常感谢!),我只需要知道实现这一点的逻辑流程。
注意:这些安装程序将要求您启用JavaScript以执行您所描述的任何幻想效果 - 如果您的应用正在执行的任务取决于JavaScript *,则取决于JavaScript *没有任何“讨厌”。人们会使用渐进式增强功能(只有在javascript可用时才添加功能)才能添加绝对可选的功能。在你给的例子中,AJAX调用轮询,更新页面,显示和隐藏进度条......所有这些都需要JavaScript,这很好。 –
@Chris是的,当且仅当它依赖于Javascript。显然,漂亮的进度条(以及一般的任何进度显示)都需要AJAX。但是,如果用户根本没有Javascript呢?我的应用程序没有依赖于Javascript - 只是简单的HTML和CSS3。因此,我询问了长时间运行PHP脚本的另一个问题。 :)(我认为这是可能的更新sans Javascript与<元刷新,但不是非常确定。) –