1. ホーム
  2. php

[解決済み] PHPでcometを使用する?

2023-06-10 05:06:31

質問

PHPのバックエンドを使ったリアルタイムチャットの実装を考えていたのですが、cometについて議論しているサイトでこのようなコメントを見かけました。

私の理解では、PHPは Comet にとってはひどい言語だということです。 Cometでは、各メンバーに 各ブラウザクライアントに対して持続的な接続を ブラウザクライアントとの持続的な接続を維持する必要があるからです。mod_php を使用すると、これは を使用することは、各クライアントのために Apache の子プロセスを をフルタイムで使用することを意味します。 は全くスケールしません。私が知っている Cometをやっている人たちは、ほとんど Twisted Pythonを使っています。 何百、何千もの同時接続を処理できるように設計されています。 同時接続を扱うように設計されています。

これは本当ですか?それとも設定次第でどうにでもなるものなのでしょうか?

どのように解決するのですか?

すでに言われていることに同意/拡大すると、FastCGIが問題を解決するとは思えません。

Apache

Apache への各リクエストは、リクエストが完了するまで一つのワーカスレッドを使用します。これは COMET リクエストでは長い時間になるかもしれません。

Ajaxianのこの記事 の記事では、Apache 上で COMET を使用すること、およびそれが困難であることに言及しています。この問題はPHPに限ったことではなく、Apacheで使いたいバックエンドのCGIモジュールにも当てはまります。

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

この MPM は、HTTP の 'keep alive problem' を修正しようとしています。 HTTP の 'keep alive 問題' を解決しようとします。 クライアントが最初のリクエストを完了した後 を完了した後、クライアントは 接続を開いたままにしておき、同じソケットを使ってさらに を送ることができます。これにより TCPコネクションを作成する際のオーバーヘッドを大幅に削減することが TCPコネクションの作成にかかる多大なオーバーヘッドを削減することができます。しかし Apache は伝統的に 子プロセス/スレッド全体をクライアントからのデータを待つために クライアントからのデータを待ち続けます。 の欠点があります。この問題を解決するために この MPM では、専用のスレッドを使って ソケットを処理します。 と、Keep Alive 状態にあるすべてのソケットを処理する専用のスレッドを使用します。 の両方を専用スレッドで処理します。

残念ながら、これもうまくいきません。なぜなら、それは 'snooze' するだけだからです。 の後に が完了した後、クライアントからの新しいリクエストを待つだけだからです。

PHP

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

のようなものが必要です。 継続 のような、トリガーされたイベントが観測されたときにコメットリクエストが再開されることを可能にするものが必要です。AFAIK、これはPHPで可能なことではありません。私はJavaで見たことがあるだけです。 Tomcat サーバー .

編集してください。

には の記事があります。 ロードバランサーの使用について ( HAProxy ) を使って、同じサーバの 80 番ポートで apache サーバと comet 対応のサーバ (例: Java 用の jetty や tomcat) の両方を実行できるようにする方法について説明します。