Php长脚本与客户端回调

时间:2014-07-06 23:58:08

标签: javascript php pdf

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

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

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

感谢您的回复

修改:

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

如果是这样,我可以使用以下方案:

  • 客户端向服务器发送ajax请求。服务器启动 该过程并将guid返回给客户端。这个指导标识 工作。
  • 客户定期检查作业的进展 通过Ajax请求,从它的guid。
  • 一旦作业结束,客户端就可以发出最后一个Ajax查询 下载PDF

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

2 个答案:

答案 0 :(得分:0)

对于长达15分钟的东西,我甚至不会使用网络套接字。 15分钟是时间,并且在此期间真的没有告诉用户将要做什么。在这种情况下,断开连接的通知过程可能会更可靠。

考虑类似的事情:

  1. 用户启动进程,将记录存储在数据库中"排队"要发生的过程。
  2. 会立即向用户显示一个页面,表明该进程已排队,并且他们可以继续使用该应用程序。
  3. 一个单独的应用程序,定期运行(每分钟?每隔几分钟?)检查"排队"数据库中的进程,将其状态更新为"正在进行中" (因此后续运行也不会获取相同的记录),并处理它们。
  4. 随着每个流程的完成,它将从数据库中删除或更新为完成的"状态。
  5. 否则将通知用户该过程已完成。
  6. 这个最终通知可以通过多种方式完成。例如,可以向用户发送电子邮件。或者考虑类似于Facebook通知栏的用户体验。网站中的每个页面都可以检查"已完成"页面加载并显示"通知"在UI中,用户指向进程的结果。如果用户在任何给定页面上花费大量时间,那么将是使用Web套接字或通过JavaScript进行长轮询以继续检查已完成流程的好地方。

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

答案 1 :(得分:0)

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

  1. 完成后你知道pdf的大小吗?
  2. 你知道多久     它需要生成。
  3. 您是否拥有可以加入的代码?     更新进度。
  4. 应用程序需要一种方法来了解何时更新已完成的百分比以及更新百分比。如果您可以这样做,那么您可以使用包装PDF的脚本将进度存储在数据库中,并在面向用户的页面上读取它,或将其存储在文件中等。

    jQuery UI进度条易于使用,但您必须知道能够告诉最终用户的百分比。

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