2010-12-21 14 views
7

私はPHPで「真の(半)」リアルタイムデータストリーミングを行う方法を知りました。PHPでの(クロスプラットフォーム)リアルタイムデータストリーミングに最適な方法は?

可能なアプリケーション:「真」と部屋、オークション、ゲームなど

チャット、私が意味するデータがどこか書かれており、継続的にポーリングされますが、実際には何らかの形でクライアントにストリーミングされていません。

"semi"とは、サーバーからクライアントへのストリームのみがリアルタイムであり、クライアントからサーバーへのメッセージがリアルタイムでないことを意味します。

クライアントとサーバー間の通信については、他のプロトコルではなくプレーンHTTP(AJAX)を使用したいと思います。

HTTPを使用してクライアントにストリーミングするには、手動で出力バッファをフラッシュします。

問題は、そのスクリプトをサーバー側に接続することですか?

そして、いったん接続すると、変更をポーリングするのではなく、ブロック読み取りを行うようになります。

共有メモリ(shmop)拡張は機能しますが、クロスプラットフォームではありません。

おそらくmemcachedは機能しますか?しかし、ブロック読み込みを行う方法があるかどうか分からないので、再びポーリングするようになります。ただし、me​​mcachedはかなり高速ですが、私は継続的なポーリングの考え方が嫌いです。

アイデア?

+0

を - 私は/サーバー側で何かをストリーム/パイプ/ポート/チャネルを開くために、いくつかの方法を探していますそのストリーム/物に現在接続されている他のスクリプトがブロッキングモードでそこから読み込み、続いて実行中のHTTP要求に結果を書き込んでフラッシュすることができます。 –

答えて

5

PHPは、リアルタイムデータストリーミングを実現するためには適していません。 PHPは非常に遅く、マルチスレッドアプリケーションを構築するようには設計されていません。あなたは、PythonやJavaのような言語で完全なソケットサーバを実装する方が良いでしょう。

前記、私は非常にNodeJSをチェックアウトをお勧めします: http://nodejs.org/

それは代わりにスレッドがイベントループにブロックしたの、I/Oのための非同期イベントベースのモデルを使用しています。 NodeJSサーバーはJavascriptで書かれています。 NodeJSは高速で、スケーラビリティがあり、学習曲線が低くなっています。

クライアントは、長いポーリングAjax要求を使用してNodeJS HTTPサーバーに接続します。 PHPはNodeJSに直接接続し、通知をプッシュできます。 PHPがメッセージキューやデータベース、memcacheなどに書き込む可能性があり、NodeJSがそれらのデータストアを更新用にポーリングして新しいメッセージをクライアントに送信します。

アップデートをポーリングするときにNodeJSからMySQL、memcachedなどの間で行き来するデーモンを作成する必要があるかもしれません。 NodeJSはデーモンプロセスでソケットを開いたままにします。デーモンプロセスは、更新のためにデータストアをポーリングし、更新をNodeJSに送信します。 NodeJS HTTPサーバーは、これらの更新をクライアントに送信します。

リアルタイムのTwitterストリームを実現するために、このチュートリアルを参照してください:私はプッシュを意味するものではありません http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/

+1

これはまさにnode.jsがあるものです – JohnO

+6

PHPが遅いのは間違っています。しかし、私は同意する必要があります。おそらく、このタイプの並列/マルチスレッドアプリケーション用に設計されたものではありませんでした。回答が受け入れられました。 –

+0

nodejsはシングルスレッドであり、スケーリングされません –

2

HTMLとJavascriptを使用している場合は、WebSocketが必要です。それがFlashか何か他のものなら、通常のTCPソケットです。

いずれかのアイデアは、接続を待つ(PHPで書かれた)サーバーファイルを実行することです。 1つまたは複数のクライアントに接続すると、データを両方向にプッシュできます。そこにいくつかのPHP WebSocketプロジェクトがあります。これをチェックアウト:

http://code.google.com/p/phpwebsocket

私はWebSocketのサーバーのライブラリーを内蔵していることに貢献してきたスケルトンと呼ばれるフレームワークでもありますまだ不安定な段階で、しかし。。

http://code.google.com/p/skeleton

残念ながら、WebSocketを、まだ新しい技術であるため、それらは普遍サポートされていません。 @Christianが述べたように、あなたはSocket.IOライブラリを使いたいかもしれません。

+1

私は最近、[ラチェット](https://github.com/cboden/Ratchet)に出くわしました。これは、PHPのウェブソケットサーバーの非常に素晴らしくクリーンでシンプルな実装です。 –

+2

私はそれを取り戻す - ラチェットは素晴らしいアイデアですが、PHPはソケットサーバーとしてリアルタイムアプリケーションには適していません - [この記事(http://software-gunslinger.tumblr.com/post/47131406821/php) -is-meant-to-die)の理由を説明します。 –

0

PHPと別の言語(C++アプリケーションなど)の間で通信したい場合は、Apache Thrift(http://thrift.apache.org/)を調べるとよいでしょう。 Apache Thriftは、Facebookで「スケーラブルなクロスランゲージ・サービス開発」のために広く使用されています。

編集:恐らくApache Thriftを使用して、Twistedアプリケーションと通信し、ポート80でリッスンし、ブラウザを長いポーリングまたはwebsocketのいずれかを使用してTwistedアプリケーションに接続させます。 Socket.IOも見てみるといいでしょう。これは、リアルタイムアプリケーション用に作られたクロスブラウザのWebソケット実装です。

基本的には、Thriftを使用してアプリケーションをTwisted Webサーバーにプッシュし、開いている接続にメッセージを渡します。

  • クリスチャン
+0

私はそれが努力する価値があるとは確信していません - PHPはこの種の仕事のために設計されたものではありませんでした。これは、HTTPライフサイクルを念頭に置いて設計されました。ステートレスな要求/応答モデルです。 NodeJSは、リアルタイム/ソケットアプリケーションにとってはるかに安全な賭けです.JavaScriptとしてコンパイルし、単にNode/V8をVMとして使用するすべての偉大な言語で、言語の壁はそれほど悪くありません。 –

関連する問題