長いポーリング(別名AJAX Comet)とPHPの問題は、PHPにそれを実際に可能にするスレッドアーキテクチャがないことです。他の従来の言語の多くは、要求を取得し、シリアル方式で迅速に応答するように構築されています。
新しい言語は、概念を完全にサポートできるようになりつつあります。実際、EPOLL(イベントベース/非同期ソケットIO)および/または接続のマイクロスレッド処理を使用するフレームワークとWebサーバーが本当に必要です。これにより、オペレーティングシステムの完全なスレッドをそれぞれに割り当てることなく、一度に数千の開いている接続を処理できます。サーバーにアクセスしている接続を開きます。(OSスレッドには有限のリソースがあります)
AJAX Comet/Longポーリングの概念を説明するビデオを作成しました。あなたはここでそれについてもっと見ることができます:http ://www.youngtechstars.com/?p = 466
さて...私は、PHPを使用して長いポーリングを行う方法について、非常にハッキーな概念実証を作成しました。カスタムNGINXmodを使用する必要がありました。最初に、リクエストはNGINXサーバーに入り、PHPプロセスにリクエストをディスパッチします(FastCGIを使用)。接続を開いたままにしておきたい場合は、カスタムHTTPヘッダー(この場合は「X-NGINX-WAIT-UNTIL-KEY:a10x39」など)を含む応答を返します。これは、NGINXに接続を保持し、まだユーザーに応答を返さないように通知します。ある時点で、データの準備ができたら、PHP(または別のプロセス)からNGINXにソケットを開いて、キーを渡しました。これを行うと、NGINXは2番目のリクエストを実行し、同じリクエストでPHPプロセスを再度ヒットして、ユーザーのレスポンスを取得します。それは概念実証であり、完璧に機能しましたが、私はそれをリリースしませんでした。クラスター化されたWeb環境では、接続が開いているサーバーを追跡する必要があるため、このモデルには問題があります。
Flexは、昔ながらのjavascriptでXmlWebRequestを実行する場合と同様に、要求が非同期で処理されるため、長いポーリングでは問題になりません。
ただし、これをすぐにサポートできるフレームワークは多数あります。