在CakePHP中输出页面后继续执行长时间运行的代码

时间:2012-02-15 00:55:13

标签: cakephp caching background-process

我有一个用CakePHP编写的后端数据管理控制台,允许用户管理一些分层数据。每次用户对数据进行更改时,我都要重新生成在网站前端使用的数据文件(在本例中为JSON)。

重建可能需要一些时间,我希望后端UI更具响应性。我的想法是在新页面(“您的更改已保存”页面)呈现给用户之后进行JSON重建。我在afterFilter()的{​​{1}}回调中有一些代码,但在JSON重建完成之前,该页面实际上并未在浏览器中呈现。

我找到了普通的PHP的代码示例,可以执行诸如发送app_controller.php HTTP标头和/或使用输出缓冲区刷新来告诉浏览器服务器在处理过程中完成的事情,但这些技术不是(据我所知),使用CakePHP的结构和自己的输出缓冲。

我想要的是一种允许我为用户完全呈现视图的技术,然后,一旦用户加载了页面,就继续在后台执行JSON重建。

我发现可能存在可能影响事物的情况/设置特定问题,所以如果您对我的特定应用程序有疑问,请告诉我。

提前致谢。

2 个答案:

答案 0 :(得分:2)

这是一个建议。这就是我从UI运行长时间运行进程以清理文件的方法。首先创建一个SHELL进行处理。 http://book.cakephp.org/2.0/en/console-and-shells.html#Shell

这将提供将运行您要运行的后台进程的代码。

然后,在UI端设置方法以调用shell。抓住PID并将其保存到数据库中(这样就可以判断它何时完成)。

$PID = shell_exec("/path/to/cake/console/cake SHELLNAME SHELLMETHOD");
$this->Jobs->query("UPDATE `jobs` SET `pid` = $pid WHERE `id` = $job_id");

然后,您可以通过查看/proc/$PID

来检查流程是否正在运行

答案 1 :(得分:2)

那些cakephp队列插件是为了这个目的而发明的: https://github.com/MSeven/cakephp_queue

他们将前端与后端服务分离,就像文件生成一样。

相关问题