静的リソースを処理するためにNginxをリバースプロキシとして使用してApacheでビルドされ実行されているPHPアプリケーションがあります。Redisを使用してPHPとsocket.io/node.jsとの通信を行います
また、ユーザーのアクティビティストリームごとにアクティビティIDを保存するために使用しているRedisもインストールされています。アクティビティはMySQLデータベースに書き込まれ、RedisはアクティビティIDを各ユーザストリームにプッシュします。ユーザーが自分のアクティビティストリームを受け取ると、まずアプリケーションはRedisのアクティビティIDのユーザーリストを取得し、次にMySQL IN()
クエリを使用して実際のアクティビティデータを取得します。
これはすべてうまく動作しますが、この設定にリアルタイム機能を追加したいと考えています。これらのイベントをユーザーのブラウザに直接伝え、一般的なライブ通知を追加できるようにしたいと考えています。
このため、socket.ioにnode.jsがインストールされています。私はsocket.ioサーバーを正しく稼働させており、クライアントはページのロード時に自動的に接続されています。
私が苦労しているのは、PHPアプリケーション内からsocket.ioにメッセージを投稿する方法を理解することです。 PHPとnode.jsは直接通信することができないので、Redisを既にインストールして起動しているので、間違いなくRedisを利用することをお勧めします。しかし、私はこれについてどうやって行くのか分かりません。
私が必要とするのは、関連するクライアントにプッシュされるために、PHPからRedisに、そしてsocket.ioに通知を送信するプロセスの説明です(コード例は非常に役に立ちます)。
また、socket.ioがどのクライアントに送信するのかわかりません。どのようにこの情報を渡し、すべてを同期させ続けるのですか?これは必要なのでしょうか? PHPセッションをRedisに保存し、ユーザーが接続するとsocket.ioでデータを収集する必要がありますか?それとも別の方法がありますか?
ありがとうございます。
注:私のPHP SESSIONデータは現在ディスクに保存されています。
Redisの上のpubsubチャネルを有し、あなたのNode.jsのプロセスから、それに加入について。 PHPはpubsubに公開してノードと通信します。クライアントごとに個別のpubsubチャネルを設定し、特定のクライアントに到達するために必要なチャネルに公開することができます。 – akonsu
@akonsuこれはまさに私が感謝をしたことです。しかし私はただ一つのpubsubチャンネルを設定し、それをsocket.ioに入れるためにすべてを公開しています。私はそこに行くべき特定のクライアントを取り組んでいます...私は接続されたクライアントごとに別々のpubsubチャンネルを定義する方が良いでしょうか?また、これを私が答えとしてより詳細に書いておきたいなら、それを正しいものにします。 :) – gordyr
正直なところ、私は各ユーザーのために別々のチャンネルを作ることについて知らない。ユーザー数によって異なります。それは拡大縮小できないかもしれません。しかし、私は確かにいくつかのチャネルを持つ可能性を念頭に置くでしょう。ある日、ユーザーベースが拡大すると、関連する複数の赤いインスタンスがあり、それらにチャネルを分割できます。 – akonsu