php - 现代 PHP Web 应用程序的 AJAX 进度指示器是如何实现的?

标签 php javascript ajax progress

我见过很多实现进度条的网络应用程序,但是,我的问题与非上传品种有关。

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

另一个很好的例子是 Joomla 的 Akeeba Backup(以前称为 Joomla Pack)。当您执行 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 最大执行时间后“保持活力”?如果他们不“作弊”,他们怎么能 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/

相关文章:

php - 将行数组插入到 SQL 表中

c# - JQuery $.post 在 VS 2010 实例中工作但在 IIS 7.5 中部署时不工作

javascript - 使用 jquery ajax 进行复选框过滤

php - 如何在 Codeigniter 中获取特定月份的天数?

php - 格式化金额为数据库格式

PHP - Paypal API 表单和安全性

javascript - 使用 d3 画笔选择折线图中的元素

javascript - 如何在 Knockout 的 Javascript 中将静态链接元素添加为下拉列表项元素

jquery - 如何在多个 ajax 调用完成之前阻止表单提交? jQuery

asp.net - 在 ASMX Web 服务中对同一 WebMethod 使用 POST 和 GET Ajax 调用