我看过很多实现进度条的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主机。)这个脚本面向所有受众(将被公开),所以我无法控制它将在哪个主机上运行。(并且假设我不会责怪最终用户有一个糟糕的主机。)
我不一定需要代码示例(虽然非常感激!),我只需要知道实现此操作的逻辑流程。
许多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主机。)这个脚本面向所有受众(将被公开),所以我无法控制它将在哪个主机上运行。(并且假设我不会责怪最终用户有一个糟糕的主机。)
我不一定需要代码示例(虽然非常感激!),我只需要知道实现此操作的逻辑流程。