3

私は、各顧客の要求に関連付けられた長時間実行されるバックグラウンド プロセスを実行する必要があるコンシューマー Web アプリに取り組んでいます。長時間実行とは、1 分から 3 分の間のどこかを意味します。

フローの例を次に示します。オブジェクト/ウィジェットはあまり重要ではありません。

  1. 顧客がサイトにアクセスし、探しているオブジェクト/ウィジェットを指定します。
  2. いくつかの初期基準に一致するウィジェットを検索/クリーンアップ/フィルタリングします。<-- 長時間実行されるプロセス
  3. 顧客は、探しているウィジェットに関する詳細をさらに構成します。
  4. 長期にわたるプロセスが完了すると、顧客は変換前の最後のいくつかのステップを完了することができます。

ステップ 3 と 4 はあまり重要ではありません。長期にわたるプロセスを実行している間に時間を稼ぐことができるので、それらについて言及しただけです。

私たちが取り組んでいる環境は LAMP スタックで、現在は PHP を使用しています。mod_php (または fastcgi プロセス) で実行時間の長いプロセスに apache スレッドを使用させるのは、良い設計とは思えません。アプリの apache レイヤーは、データ処理 IMO ではなく、コンテンツの提供に重点を置く必要があります。

いくつかの質問:

  1. この「長時間実行」部分を apache/web アプリ レイヤーから分離する必要があるという点で、私たちの考えは正しいでしょうか?
  2. Linux/Apache/MySQL/PHP でこれを解決する標準/典型的な方法はありますか (適切な場合、処理に別の言語を使用することは可能です)。
  3. それを打破する方法について何か提案はありますか?たとえば、FIFO キューをかき回すデーモンを作成しますか?

編集: 明確にするために、長時間実行されるプロセスの約 1/4 のみがデータベース中心です。その部分の最適化に取り組んでいます。できることはありますが、今できることは限られています。

ありがとう!

4

6 に答える 6

1

Jonnii が提案したように、子プロセスを開始してバックグラウンド処理を実行できます。ただし、これには注意が必要です。

  • 渡されたパラメータが正しくエスケープされていることを確認してください
  • プロセスの複数のコピーが同時に実行されないようにする

プロセスの複数のコピーが実行された場合、(悪意のあるユーザーでなく、せっかちなだけでなく) ユーザーがページでリロードを押してページを開始するのを止めることはできません。

したがって、サブプロセスを使用できますが、慎重に、制御された方法で行い、適切にテストしてください。

もう 1 つのオプションは、要求を待機するデーモンを永続的に実行し、要求を処理して結果をどこかに (おそらくデータベースに) 記録することです。

于 2008-10-26T06:12:11.040 に答える
1

アプリケーションではなく、Web サービスから AJAX を介して検索結果を提供することを検討してください。おそらく、これを別のサーバーにオフロードして、Web アプリケーションで必要に応じてコンテンツを処理できるようにすることができます。

興味深いことに、ルックアップ クエリの場合、1 ~ 3 分は長いように思えます。速度を向上させるために、クエリを実行している列のインデックスを調べましたか? それとも、何らかのアルゴリズム プロセスを実行する必要がありますか?おそらく、このオフラインで実行して、一般的な検索にヒントを事前入力することができますか?

于 2008-10-24T21:44:53.150 に答える
0

これは貧しい人の解決策です:

exec ("/usr/bin/php long_running_process.php > /dev/null &");

または、次のこともできます。

  1. バックグラウンド リクエストの詳細を含む行をデータベースに挿入します。これにより、デーモンが読み取って処理できます。

  2. デーモンが読み取って処理するメッセージキューにメッセージを書き込みます。

于 2008-10-24T21:44:14.260 に答える
0

この問題の Java バージョンに関するいくつかの議論があります。

Javaを参照してください: バッチ サーバーと通信するための最良の手法は何ですか

あなたがするかもしれない2つの重要なこと:

  1. Java に切り替えて JMS を使用します。

  2. JMS を調べますが、別のキュー マネージャーを使用します。たとえば、Unix の名前付きパイプは、受け入れ可能な実装である可能性があります。

于 2008-10-24T23:32:44.773 に答える
0

Java サーブレットはバックグラウンド処理を行うことができます。スレッド化をサポートする Web テクノロジで、このテクノロジと同様のことを行うことができます。ただし、PHPについてはわかりません。

于 2008-10-24T23:50:34.973 に答える
-1

完全な答えではありませんが、AJAX を使用して 2 番目のステップを PHP (C、C++、C#) よりも高速なものに渡し、PHP 関数がスタックから結果を取得する可能性が高いと思います。

于 2008-10-24T21:44:59.000 に答える