我在某些控制器中有一个 myAction 函数。它有一个类实例:
public function myAction() {
...
$myAnalyzer = new Analysis();
$myAnalyzer->analyze();
...
}
假设这个函数analyze() 需要10 分钟。这意味着它会阻止 my.phtml 10 分钟,这是不可接受的。我想要的是首先呈现 my.phtml,然后在 my.phtml 上显示来自 analyze() 的中间结果。
function analyze() {
...
foreach($items as $rv) {
...
...
// new result should be stored in db here
}
}
据我所知,这是不可能的,因为 PHP 中只有一个线程。所以我决定从 my.phtml ajax-call 来运行 myAnalyzer 实例。
第一个问题:对吗?我可以在 myAction() 中进行而不阻塞吗?
好的,现在我在 javascript 或 JQuery 的帮助下使用 my.phtml 中的一些脚本(比如 worker.php)运行 myAnalyzer。
第二个问题:我怎么知道每个 foreach 循环何时结束?换句话说,我怎样才能让 worker.php 向 my.phtml 或 zend 框架发送一些信号(或事件)。我不想使用 javascript 计时器按时间更新 my.phtml。这就是我需要知道的全部内容,因为中间数据应该存储在 DB 中。
第三个问题:当用户离开页面时,myAnalyzer 必须停止。为此,我有这个代码。
window.onbeforeunload = function(e) {
// killer.php kills myAnalyzer
};
但是 javascript 如何与 myAnalyzer 通信呢?有类似进程ID的东西吗?我的意思是,当worker.php 运行myAnalyzer 时,它会在zend 框架中注册它的进程ID。当用户离开页面时,killer.php 使用这个进程 ID 停止 myAnalyzer。
我提前感谢您的帮助。