【问题标题】:Php long script with client side callback带有客户端回调的 PHP 长脚本
【发布时间】:2014-07-06 23:58:07
【问题描述】:

我在 php 脚本中有一个很长的过程(生成一个巨大的 pdf)。 我的 HTML 页面中有一个启动 php 脚本的按钮,我想显示一种进度条或至少一个动画 gif,当 php 脚本结束时,显示生成的 pdf。

pdf 的生成可能持续 15 分钟,因此 php 引擎超时退出,浏览器也退出。

我有办法声明一种客户端回调,一旦服务器端进程结束就会被调用?

感谢您的回复

编辑:

感谢您的回复 :) 如果我很好理解,我必须在服务器端启动进程并“分离”我的客户端,即不要等到进程结束。相反,我的客户应该定期检查服务器端进程的进度。对吧?

如果是这样,我可能会使用以下场景:

  • 客户端向服务器发送 ajax 请求。服务器启动 该过程并向客户端返回一个 guid。本指南标识 工作。
  • 客户端定期检查作业的进度 通过 Ajax 请求,来自其 guid。
  • 一旦作业结束,客户端可以发出最后一个 Ajax 查询到 下载 PDF

这意味着服务器必须将生成的 PDF 保存在其磁盘上,并等待最终的 Ajax 请求发送文件并删除它,对吧?

【问题讨论】:

  • 你真的应该把它推到后台,并让客户知道它什么时候通过电子邮件说。

标签: javascript php pdf


【解决方案1】:

在长达 15 分钟的时间里,我什至不会为此使用网络套接字。 15 分钟是一个很长 的时间,并且真的不知道用户在此期间将要做什么。在这种情况下,断开连接的通知过程可能会更可靠。

考虑类似:

  1. 用户启动流程,从而将记录存储在数据库中“排队”进行流程。
  2. 用户会立即看到一个页面,指示该进程已排队并且他们可以继续使用该应用程序。
  3. 定期运行的单独应用程序(每分钟?每几分钟?)检查数据库中的“排队”进程,将其状态更新为“进行中”(因此后续运行也不会获取相同的记录),并对其进行处理。
  4. 每个流程完成后,要么从数据库中删除,要么更新为“已完成”状态。
  5. 否则会通知用户该过程已完成。

此最终通知可以通过多种方式完成。例如,可以向用户发送电子邮件。或者考虑类似于 Facebook 通知栏的用户体验。网站中的每个页面都可以在页面加载时检查“已完成”进程,并在 UI 中显示“通知”,将用户引导至进程结果。如果用户在任何给定页面上花费大量时间,那么 this 将是使用 Web 套接字或通过 JavaScript 进行长轮询以继续检查已完成进程的好地方。

主要是将用户界面与长时间运行的进程分开。 Web 应用程序的设计不适合运行这么长时间的进程。通过分离关注点,Web 应用程序可以只关注用户界面,而命令行应用程序可以专注于处理。 (作为额外的好处,这将防止用户因过多的并发进程而使服务器过载。命令行应用程序一次只能运行一条记录,因此过多的并发进程只会减慢响应速度,而不是服务器.)

【讨论】:

    【解决方案2】:

    正如@David 所说,但没有人覆盖进度条,这取决于您所知道的(您是创建 pdf 的应用程序)。

    1. 你知道pdf完成后的大小吗?
    2. 你知道多久 它需要生成。
    3. 你有可以挂钩的代码吗 更新进度。

    应用程序需要知道何时更新已完成百分比以及更新多少。如果你能做到这一点,那么你可以使用创建 PDF 的脚本将进度存储在数据库中并在面向用户的页面上阅读,或者将其存储在文件中,等等。

    jQuery UI 进度条易于使用,但您必须知道完成了多少百分比才能告诉最终用户。

    之后,使用 ajax (jquery $.post) 和文件是一件非常简单的事情,我就是这样做的。我只是编写了一个简单的文本文件,其中包含一个代表完成百分比的数字。通过 ajax 加载它并将其提供给 jquery ui 进度小部件。

    【讨论】:

      猜你喜欢
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多