ここに、いくつかのコントローラーにmyAction関数があります。そしてそれは1つのクラスインスタンスを持っています:
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にはスレッドが1つしかないため、それは不可能です。そこで、my.phtmlからajax-callしてmyAnalyzerインスタンスを実行することにしました。
最初の質問:そうですか?ブロックせずにmyAction()で実行できますか?
OK、今私はjavascriptまたはJQueryの助けを借りてmy.phtmlからいくつかのスクリプト、たとえばworker.phpを使用してmyAnalyzerを実行します。
2番目の質問:各foreachループがいつ終了するかをどのように知ることができますか?言い換えると、worker.phpに何らかのシグナル(またはイベント)をmy.phtmlまたはzendフレームワークに送信させるにはどうすればよいですか?javascriptタイマーを使用してmy.phtmlを時間ベースで更新したくありません。中間データはDBに格納されることになっているので、私が知る必要があるのはそれだけです。
3番目の質問:ユーザーがページを離れると、myAnalyzerは停止します。そのために私はこのコードを持っています。
window.onbeforeunload = function(e) {
// killer.php kills myAnalyzer
};
しかし、javascriptはmyAnalyzerとどのように通信できますか?process-idのようなものはありますか?つまり、worker.phpがmyAnalyzerを実行すると、そのプロセスIDがzendフレームワークに登録されます。そして、ユーザーがページを離れると、killer.phpはこのプロセスIDを使用してmyAnalyzerを停止します。
よろしくお願いします。