私は、プロセッサ集中型の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を混在させることができるかどうかを知りたいと思います。もしそうなら、誰かが私を始めるための簡単な例を提供できますか?
ありがとうございます!
リモートマシンのautomate_process.batは、 1つの静的ファイル。ログインしたユーザーに固有のいくつかのファイルを作成します。私はcronが答えではないと思います。私が本当に望んでいるときに、データを取得するのにかかる時間を最小限に抑えることが「あなたのAJAX呼び出しのタイムアウトを増やす」ということを理解しているかどうかはわかりません。 – ariestav
私がファイルにダンプすることについては、上記のように定期的にリモートマシンにpingを実行し、後で取得できるように静的ファイルにデータを保存するPHPファイルを作成することができたということです。しかし、ほとんどの呼び出しは異なるので、それは良い解決策ではありません。 –
ajax呼び出しのタイムアウトを増やすと、サーバーがデータを返信する前に接続を閉じたりエラーを出したりするのを防ぐだけです。基本的には長いポーリングと同じですが、接続を中断することはありません。多くの同時接続で問題になることがあります。これは設定によって異なります。 –