2012-03-02 8 views
1

私は、プロセッサ集中型のWebアプリケーションを設計するのは比較的新しいと言って、この質問の序文を書いてみましょう。私はLAMPスタック上に構築された機能的なアプリケーションを持っています。そして今、私は規模のために実装しなければならない開発段階にいます。完了までに時間がかかるajaxリクエストを処理するにはどうすればよいですか?

sshがリモートWindowsマシンにPHPコードを実行しているWebサーバーがあるため、並行処理によって約15〜45秒かかることがあります。私はphpseclib pear library packageによって提供されたSSH2実装を使用して、リモートマシンにログインして、Sysinternals' PsExecでバッチファイルを起動します。 PHPコードは次のようになります。

$remoteCommand = 'psexec -u username -p password -h cmd /C "C:\\automate_process.bat >> automate_process.log 2>>&1"'; 
$ssh_connection->exec($remoteCommand); 

これは基本的にPHPコードをホストしているWebサーバからリモートのWindowsマシン上automate_process.batを呼び出します。ただし、automate_process.batファイルは実行に時間がかかり、同時ユーザーが存在するとWebサーバーのPHPがタイムアウトすることがあります。 php.iniのmax_execution_timeの値を大きくしても問題は解決しません。

PsExecを使用すると、-dスイッチはautomate_process.batが完了するのを待たず、待機せずにPHPスクリプトを続行できます。したがって、max_execution_timeのフロントで問題が解決されましたが、自動プロセスが完了したことをエンドユーザのブラウザに通知するという別の問題が発生します。どのように効果的にこれを行うことができますか?一見必要なのは、アプリケーションコードのアーキテクチャ上の変更です。

最初は、何らかのポーリングがこのトリックを行うと思っていました - 多分ロングポーリング?私はちょうどプロセスが完了したかどうかを確認するためにリモートのWindowsマシンにpingします。しかし、私が読んだすべてのことは、長いポーリングはリモートWindowsマシンが実行しているApacheに重大な負担だと言います。さらに、Web上の優れた文章は、解決策としてNode.jsを指しています。それは本当にこのタイプの問題に対する解決策ですか?アプリケーションの規模が拡大するにつれて、この操作を堅固にするための新しいフレームワークを学ばなければならないのですか?私はそれで問題ないですが、PHPとNode.jsを混在させることができるかどうかを知りたいと思います。もしそうなら、誰かが私を始めるための簡単な例を提供できますか?

ありがとうございます!

答えて

1

これはAJAXリクエストであるため、簡単な(ただし必ずしも理想的ではない)オプションは、PsExecで-dスイッチを省略するだけで、スクリプトが完了するのを待つため、PHPでそのスクリプトのmax_execution_timeを上げます。 AJAXコールのタイムアウトを増やしてください。そうすれば、ブラウザは出力が得られるまでその接続を開いたままにします。それが良い解決策であるかどうかは、多くの要因に左右されます。

これらのAJAX要求のすべてが同じデータを要求している場合(またはわずかな要求がある場合)、データは最新のものである必要はありません。そのプロセスをサーバー上で定期的に実行し、出力をファイルに保存します(おそらく5分ごと)、ajax呼び出しはその静的ファイルを要求するだけです。ファイル内の情報が機密情報の場合は、セキュリティのレイヤーを自然に追加する必要があります。

+0

リモートマシンのautomate_process.batは、 1つの静的ファイル。ログインしたユーザーに固有のいくつかのファイルを作成します。私はcronが答えではないと思います。私が本当に望んでいるときに、データを取得するのにかかる時間を最小限に抑えることが「あなたのAJAX呼び出しのタイムアウトを増やす」ということを理解しているかどうかはわかりません。 – ariestav

+0

私がファイルにダンプすることについては、上記のように定期的にリモートマシンにpingを実行し、後で取得できるように静的ファイルにデータを保存するPHPファイルを作成することができたということです。しかし、ほとんどの呼び出しは異なるので、それは良い解決策ではありません。 –

+0

ajax呼び出しのタイムアウトを増やすと、サーバーがデータを返信する前に接続を閉じたりエラーを出したりするのを防ぐだけです。基本的には長いポーリングと同じですが、接続を中断することはありません。多くの同時接続で問題になることがあります。これは設定によって異なります。 –

1

処理時間がそれであれば、最初のAjax要求で処理を開始するようにクライアントを設定します。サーバーはプロセスを開始し、「処理中」と応答します。このサイクルは、クライアントからのajax要求の間に10秒の遅延が繰り返され、プロセスが終了するまでサーバー上の各クライアントを追跡するだけで済みます。

+0

しかし、複数のAjaxリクエストは、Apacheの問題を提示していませんか?あなたのソリューションはポーリングのように聞こえるが、私の質問は、Node.jsやWebsocket.IOやCometdのようなフレームワークが、重い処理を行っているリモートマシンからのアップデートを入手するのに理にかなっているかどうかである。 – ariestav

+0

Apacheの問題について私が理解していることは、apacheがオープンリクエストを好まないということです。私の提案した構造は、開かれたままのリクエストを排除します。最初のリクエストの一部としてwebsocketを設定することは、私の提案された解決策を大きく改善するでしょう。 WebSocketがすべてのクライアントによってサポートされていることが分かっていない限り、私はあなたが非ウェブソケットクライアントをとにかく劣化させなければならないので、私が最初に提案したように設定します... – shaun5

+0

私は間違っているかもしれませんが、 -websocketクライアント。 node.jsと一緒にsocket.ioを使う方法を学びました。 – ariestav

関連する問題