2012-02-15 9 views
1

CakePHPで書かれたバックエンドデータ管理コンソールで、ユーザーはいくつかの階層データを管理できます。ユーザーがデータを変更するたびに、サイトのフロントエンドで使用されているデータファイル(この場合はJSON)を再生成します。CakePHPでページ出力後に長時間実行するコードを続行

リビルドには時間がかかることがあります。バックエンドUIを少し敏感にしたいと思います。私の考えは、新しいページ(「あなたの変更が保存されました」ページ)がユーザにレンダリングされた後にJSONの再構築を行うことです。 afterFilter()のコールバックにapp_controller.phpというコードがありますが、JSONの再構築が完了するまで、ページは実際にはブラウザでレンダリングされません。

HTTPヘッダーをConnection: Closeに送信したり、出力バッファをフラッシュして処理中にサーバーが終了したことをブラウザに伝えるようなプレーンバニラPHPのコード例が見つかりました。 CakePHPの構造とそれ自身の出力バッファリングで動作します。

私が望むのは、ユーザーのビューを完全にレンダリングし、ユーザーがページを読み込んだ後、バックグラウンドでJSONの再構築を続行する方法です。

状況に影響を与える可能性のある状況や設定がある可能性があることを認識していますので、特定のアプリケーションについて質問がある場合はお知らせください。

ありがとうございます。

+4

私はむしろ、 "UIスレッド"をピギーバックするよりも、このタスクをバックグラウンドデーモン/ cronジョブ/キューワーカーに委譲することをお勧めします。 – deceze

+0

それがオプションだったら、私は間違いなくそれをやるでしょう。残念ながらそうではありません。 – theraccoonbear

答えて

2

それらCakePHPのキュープラグインは、まさにこの目的のために発明されています https://github.com/MSeven/cakephp_queue

彼らはそれらのファイルの世代のようなバックエンドサービスからフロントエンドを切り離します。

+0

これは有望そうです。 2.0互換にする計画はありますか?何も始まって​​いなければ、私はフォークするかもしれません。 ;) –

+0

まあ、私は試して、ほぼ完了しました:)私のために働くようです:https://github.com/dereuromark/cakephp_queue – mark

2

ここに提案があります。これは、ファイルをスクラブするためにUIから長時間実行されているプロセスを実行する方法です。まず、処理を行うSHELLを作成します。 http://book.cakephp.org/2.0/en/console-and-shells.html#Shell

これは、実行しようとしているバックグラウンドプロセスを実行するコードを提供します。

次に、UI側でメソッドを設定してシェルを呼び出します。 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

これは興味深いアプローチです。私は、基本的なRESTfulインターフェイスを作成し、AJAX経由で呼び出すという、より労働集約的な方法を採用しました。私はその道を踏み出す前に、非同期のcURLを動かそうと多くの時間を費やしました。あなたの提案は気づいておくのが良いテクニックだと思います。ありがとう。 –

関連する問題