web-dev-qa-db-ja.com

PHPで彗星を使用していますか?

PHPバックエンドを使用してリアルタイムチャットを実装することを考えていましたが、彗星を議論しているサイトでこのコメントを見つけました。

私の理解では、PHPはCometにとってひどい言語です。なぜなら、Cometでは各ブラウザクライアントへの永続的な接続を開いたままにする必要があるからです。mod_phpを使用すると、まったくスケーリングしないクライアント。Cometのことをやっている人は、ほとんどがTwisted Pythonを使用しており、これは数百または数千の同時接続を処理するように設計されています。

これは本当ですか?それとも、周りに構成できるものですか?

82
ryeguy

既に言われたことに同意/拡大しても、FastCGIが問題を解決するとは思わない。

アパッチ

Apacheへの各リクエストは、リクエストが完了するまで1つのワーカースレッドを使用します。これは、COMETリクエストには時間がかかる場合があります。

Ajaxianのこの記事 ApacheでCOMETを使用することについて言及しており、それは難しいことです。この問題はPHPに固有のものではなく、Apacheで使用したいバックエンドCGIモジュールに適用されます。

推奨される解決策は、リクエストがワーカースレッドにディスパッチされる方法を変更する 'event' MPMモジュール を使用することでした。

このMPMは、HTTPの「キープアライブの問題」を修正しようとします。クライアントが最初の要求を完了した後、クライアントは接続を開いたままにして、同じソケットを使用してさらに要求を送信できます。これにより、TCP接続を作成する際のオーバーヘッドが大幅に削減されます。ただし、Apacheは伝統的に子プロセス/スレッド全体をクライアントからのデータを待機させます。専用のスレッドを使用して、リスニングソケットと、キープアライブ状態にあるすべてのソケットの両方を処理します。

残念なことに、それは機能しません。「スヌーズ」afterリクエストが完了し、クライアントからの新しいリクエストを待つからです。

PHP

さて、問題の反対側を考えると、コメットリクエストごとに1つのスレッドを保持する問題を解決したとしても、リクエストごとに1つPHPスレッドが必要です。助けて。

Continuations のようなものが必要です。これにより、トリガーされるイベントが観測されたときに彗星リクエストを再開できます。私の知る限り、これはPHPで可能なことではありません。 Java-Apache Tomcatサーバー をご覧ください。

編集:

記事はこちら ロードバランサーの使用について( HAProxy )、Apacheサーバーと彗星対応サーバー(たとえば、突堤、Tomcat for Java)の両方を実行できる同じサーバーのポート80。

61
Mike Houston

NginxとJavaScriptを使用して、Cometベースのチャットシステムを実装できます。このシステムは、メモリやCPUの使用率が低く、非常にスケーラブルです。

ここに非常に簡単な例を示します。 NHPMモジュールを使用したNginxのコンパイルについて説明し、jQuery、PHP、およびBashでの単純なパブリッシャー/サブスクライバーロールのコードが含まれています。

http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/

14
Jamie

PHP

この面白い小さな screencasts が簡単な彗星を説明しているのを見つけました。サイドノートとして、これは実際の負荷でサーバーを殺すと本当に思っています。数人のユーザーがいる場合は、このソリューションを選択するだけです。このソリューションの実装は本当に簡単です(スクリーンキャストにかかる時間はわずか5分です:))。しかし、私が以前に言っていたように、私はそれが多くの同時ユーザーにとって良いとは思わない(あなたはそれをベンチマークする必要があると思う;))

  1. メモリからデータを取得するよりもはるかに遅いファイルI/Oを使用します。たとえば、関数filemtime()
  2. 第二に、少なくともPHPはまともなスレッドモデルを持たない。PHPは 何も共有しないモデル 。スライドのように、たとえばMySQLのように「共有データはデータストア層にプッシュダウンされます」と書かれています。

代替案

コメット/ロングポーリングを行いたい場合は、代替手段を試してみるべきだと思います。たとえば、次のような多くの言語を使用できます。

  • Java/JVM:Jetty 継続
  • Python:ダスティンの slosh
  • Erlang:comet/etcの一般的な言語。
  • Lua、Ruby、C、Perl。

単純なグーグル検索を実行するだけで、PHP(多くの負荷がかかるとサーバーが殺されると思います)も多くの選択肢が表示されます。

10
Alfred

mod_phpは、PHPを使用する唯一の方法ではありません。 fastcgiを使用できます。 PHPは--enable-fastcgi

FastCGIとしてのPHP: http://www.fastcgi.com/drupal/node/5?q=node/1

7
vartec

https://github.com/reactphp/react を試すこともできます

Reactは、PHPのイベント駆動型プログラミング用の低レベルライブラリです。その中心にはイベントループがあり、その上にストリームアブストラクション、非同期DNSリゾルバ、ネットワーククライアント/サーバー、httpクライアント/サーバー、プロセスとの相互作用などの低レベルユーティリティがあります。サードパーティライブラリはこれらのコンポーネントを使用して、非同期ネットワーククライアント/サーバーなどを作成できます。

イベントループは、リアクタパターン(名前の由来)に基づいており、EventMachine(Ruby)、Twisted(Python)、Node.js(V8)などのライブラリに強く影響を受けています。

導入例は、ポート1337でリッスンする単純なHTTPサーバーを示しています。

<?php

$i = 0;

$app = function ($request, $response) use (&$i) {
    $i++;

    $text = "This is request number $i.\n";
    $headers = array('Content-Type' => 'text/plain');

    $response->writeHead(200, $headers);
    $response->end($text);
};

$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server($loop);
$http = new React\Http\Server($socket);

$http->on('request', $app);

$socket->listen(1337);
$loop->run();
6
Gordon

同様の問題が発生しています。おもしろいと思うオプションの1つは、cometd-Javaやcometd-pythonなどの既存のCometサーバーをコアメッセージハブとして使用することです。 PHPコードは、Cometサーバーの単なるクライアントです。他のクライアントと同じように、チャネルからメッセージを投稿または読み取ることができます。

ここにリンクされている興味深いコードスニペットがあります: http://morglog.org/?p=22=1 このメソッドの一部を実装します(ただし、デバッグコードも散らばっています)。

4
Evan P.

現在、スケーラブルなPHPソケット関数を使用したCometサーバーを実装しています。これは 'phet'([ph] p com [et])と呼ばれます)

プロジェクトページ: http://github.com/Tim-Smart/phet

無料で開発に参加できます。私は現在、ほとんどのサーバーロジックを完了させることができました。クライアント側の処理を完了するだけです。

編集:最近追加されたpcntl_forkメソッドを使用した「マルチスレッド」機能:)

3
Tim

PHPに彗星を実装するのに苦労するのは、それが固有のシングルスレッドであるという理由だけです。

Websync On-Demand をチェックしてください-このサービスでは、サーバー側の公開を介してPHPを統合し、同時接続の負荷を軽減して、すぐに時間チャットアプリ。

3
jvenema

PHPを含むあらゆる言語でCometを使用できるnginx Webサーバー用の新しいモジュールが登場しました。

http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-Push/

1
ceejayoz

PHPで独自のサーバーを作成する必要があります。 Apache/mod_phpまたはfastcgiを使用しても、まったくスケーリングしません。数歳ですが、始めることができます:

PHP-Comet-Server: http://sourceforge.net/projects/comet/

1
sroussey

これは、多くのApacheスレッドが常に実行されていることが問題であるというより多くの問題だと思います。 PHP(通常)と同じようにApache経由で動作する場合、どの言語でも存在します。

0
benlumley