我见过很多实现进度条的网络应用程序,但是,我的问题与非上传品种有关。
许多 PHP 网络应用程序(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 最大执行时间后“保持活力”?如果他们不“作弊”,他们怎么能 Handlebars 头的任务分开呢? (我注意到 Akeeba Backup 确实承认 PHP 最大执行时间限制,但我不想挖掘得太深以找到此类代码。)
- 如何通过 AJAX+PHP 显示进度?我读到过人们使用文件来指示进度,但对我来说这似乎是“肮脏的”并且会给 I/O 带来一些压力,尤其是对于运行上述脚本的 10,000 多名访问者的实时服务器。
这个脚本的环境是开启safe_mode的地方,一般限制为30秒。 (基本上,一个限制性的、免费的 0 美元主机。)这个脚本面向所有观众(将公开),所以我无权决定它将在哪个主机上。 (这是假设我不会因为主机不好而责怪最终用户。)
我不一定需要代码示例(尽管非常感谢!),我只需要知道实现它的逻辑流程。
最佳答案
通常,这种东西存储在 $_SESSION 变量中。就执行超时而言,我通常做的是有一个 JavaScript 超时,每隔 x 秒将更新状态 div 的 innerHTML 设置为 PHP 脚本。当这个脚本执行时,它不会“等待”或类似的事情。它只是从 session 中获取当前状态(通过实际执行安装的脚本更新)然后以我认为合适的任何奇特方法(状态栏等)输出。
我不会推荐任何用于状态更新的直接 I/O。你是对的,因为它很困惑而且效率低下。我会说 $_SESSION 绝对是去这里的方式。
关于php - 现代 PHP Web 应用程序的 AJAX 进度指示器是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8480563/