5

頻繁に変更されるDBからのデータ(キューのステータスとチャットの会話)を表示するWebサイトで作業しています。私の現在のセットアップはApache/PHP/MySQLです。当然、これは適切にスケーリングされないため、x秒ごとにサーバーをポーリングすることは避けたいと思います。逆ajaxロングポーリングを実行したいのですが、Apacheはワーカースレッドをすぐに使い果たしてしまうため、これではうまく機能しないことを読みました。この問題を回避する他の多くのWebサーバーがあります:nginx、tor​​nadoなど。しかし、私の問題は、PHPが私が知っている唯一のサーバーサイドスクリプト言語であるということです。また、私はすでにいくつかのPHPスクリプトを作成しているので、可能であればそれらを保持したいと思います。PHPを使用できる限り、サーバーの切り替えは問題ありません。

しかし、さらに調査を行った後、PHP(PHP-FPM?)は、要求が行われるたびにプロセスを作成すると言われています。つまり、接続が数百/数千ある場合、プロセスは数百/数千になります。 、これも問題になります。

PHPを使用して長いポーリングWebサイトを作成するための優れたスケーラブルな方法はないと結論付けることはできますか?PHPを放棄して、別のサーバースクリプト言語を学ぶ必要がありますか?今のところ、現在のセットアップ(Apache / PHP)を使用して長いポーリングを開発し続けることができますが、スクリプト言語の選択によって、展開時にシステムのスケーラビリティが制限されることは望ましくありません。だから私は何をすべきですか?私はWebプログラミングの経験があまりないので、そこにいる教祖が私にいくつかの指針を与えることができれば、私はそれを感謝します!ありがとうございました!

4

2 に答える 2

6

php-fpmモードで実行されたPHPには、特にコードが大量のメモリを消費している場合は、まだ制限があります。使用可能なメモリがないと、何千もの並列プロセスを実行できません。ただし、通常はmod_phpよりも高速に実行され、少なくともPHPを必要としないHTTPリクエストはウェブサーバーによって処理されます。そのウェブサーバーがnginxの場合、より多くのHTTPリクエストを並行して利用できます。

php-fpmを使用すると、待機中のリクエストのキューも作成されます。これは、一時的に大きなトラフィックが発生した場合に役立つ可能性があります。少なくともリクエストはキューに入れられ、拒否されないためです。

これで、長いポーリング操作はnginx(または他の例です)では問題ありませんが、PHPでは問題ありません。PHPは、長時間実行されるサーバーとして構築されていません。各リクエストは新しいプロセスであり、KeepAliveの場合は実際には正しい選択ではありません。しかし、「分割統治」(分割統治)。長いポーリングタスクは、PHPアプリケーションの近くで実行できますが、PHPアプリケーションは実行できません。

jappixプロジェクトの例として、これはPHPプロジェクトです。ただし、XMPPサーバー(ejabberdなど)と、そのBOSHサーバーへのポート80のプロキシとしてnginxを使用するBOSHサーバーを配置する必要があります(したがって、ポート80にnginxとejabberdを介してxmppチャットプロトコルがあり、何もありませんそのためのPHP側)。問題は、アプリケーションの認証や識別などを接続することです。これは、XMPPサーバー構成を拡張することによって行う必要があります(たとえば、PHPアプリと同じLDAPサーバーを使用するようにします)。

2番目の長いポーリングの問題は、キューのステータスです。そのためのXMPP拡張機能が見つかるかもしれません。または、キューに対して通常のajaxクエリを実行することもできます。PHPアプリケーションで多数のajaxリクエストを回避するための便利なテクニックの1つは、フィボナッチ数に基づいて、チェックのajaxコールバックで次のajaxチェックを再スケジュールすることです(これは例です)。したがって、最初のajax呼び出しは、1分後にスケジュールされ、次回は2分、次に3m、5m、8m、13m、21m、34m、55m、89m、144mなどにスケジュールされます。着信する新しいメッセージページの読み込みから1分後。ユーザーがまだ同じページを読んでいる(またはコーヒーを飲んでいる、友人と話している、コンピューターの電源を切らずに休日に行くなど)ので、次のチェックをますます遅らせることができます。ユーザーが実際にはアクティブではないと想定する方法です。他の方法でユーザーアクティビティを検出し、再スケジュールを変更できることに注意してください。

于 2012-02-19T17:08:18.000 に答える
-1

PHPは、長いポーリング、Comet、およびリバースajaxテクノロジーには適していません。Node.jsを使用する必要があります

于 2013-05-20T13:52:49.157 に答える