html-page 上の js と php-script の間の相互作用を提供する必要があります。
- AJAX を使用します。
Ok。しかし問題は、php-script が長時間実行されていることであり、このスクリプト処理の状態 (例: 60% 完了) を知る必要があり
ます。どうすればよいですか? 2 つの php スクリプト (client&server) を作成し、client.php に対して ajax-request を実行します。これは、ソケットまたは smth を介して server.php への要求を実行しますか? よりエレガントなソリューションはありますか?
6 に答える
- Ajaxはphpスクリプトを呼び出し、スクリプトが実行されている情報を返します。
- メインスクリプトはlock.fileを作成します。
- cronから呼び出されたスクリプトは、lock.fileが存在するかどうかを確認し、正しいスクリプトを実行します。
- 正しいスクリプトは、現在の進行状況をprogress.txtに保存します。
- Ajaxはprogress.txtを読み取っており、進行状況が100%になると、スクリプト処理が終了したという情報を返します。
編集:タイムアウトの問題を指摘してくれたJustinに感謝します;)
HTTP セッション内で完全に長時間実行されるプロセスを実行するべきではありません。
この問題に対する単純で一般的なアプローチは、メッセージ キューイングです。基本的に、UI で要求をデータベース テーブルにキューに入れ、外部デーモンにキューを処理させます。
フィードバックを提供するには、デーモンが現在作業中の行のステータスでテーブルを定期的に更新するようにします。次に、JavaScript コードは、データベースからその作業項目のステータスを取得してユーザーに表示するスクリプトに対して AJAX 要求を行うことができます。
処理を実行するスクリプトに、そのステータスをときどきファイルに書き込んでもらうとどうなるでしょうか。ファイルを読み取り、元のファイルのステータスを返す 2 つ目のスクリプトを作成します。
本当に凝ったものにしたい場合は、php スクリプトからの出力を stdout に書き込み、パイプ経由でキャプチャします。これには、exec() または proc_open() (http://php.net/manual/en/function.proc-open.php) を使用して php スクリプトを実行し、出力をファイルにパイプする必要があります (または、余分なファンシー、node.JSを使用してそのデータをリッスンします)
これを実現するには、いくつかの方法があります。
- Node.JS
- x 秒ごとの Ajax クエリ
- META/Javascript ページのリロード
- 定期的にステータスをリロードしている iframe。
幸運を!
あなたのprocess.php
:
// 1st task
$_SESSION['progress'] = 0;
// your code for the first task here ...
// 2nd task
$_SESSION['progress'] = 10;
// you code for 2nd task ...
// 3rd task
$_SESSION['progress'] = 17;
// continue ...
// everything finished?
$_SESSION['progress'] = 100;
あなたのprogress.php
:
// simply output
echo $_SESSION['progress'];
クライアント側から にリクエストを送信しprogress.php
、番号を受け取ってプログレス バーに渡すだけです。
自分でそれを確認しませんでしたが、うまくいくことを願っています! :)