2016-12-12 7 views
-1

Ratchettを使用して、PHPを使用してWebサーバーにソケットを作成しています。PHPでソケットを扱う方法

現在私は持っ - サーバ、B - (で)データベースに変更を探してデバイスとC - Aでデータベースに変更を加える装置()とcurlリクエストを送信します。

現在が変更された場合、データベースの変更をAに保存します。 Bアイテムがあるか否かをソケットを介してと毎秒をチェックしている間意味するリターン応答に要求を送信することによって、データベース内にあります。これはBのリソースです。 を更新するために、がソケットを変更するときのための方法が必要です。

これは、ソケットのコードです:

getNotifications()は、データベースの変更を取得し、deleteNotification()はそれを削除します
<?php 
namespace Notify; 
use Ratchet\MessageComponentInterface; 
use Ratchet\ConnectionInterface; 

require "/NAS/notify/db.php"; 

class Note implements MessageComponentInterface { 
    protected $clients; 

    public function __construct() { 
     $this->clients = new \SplObjectStorage; 
    } 

    public function onOpen(ConnectionInterface $conn) { 
     $this->clients->attach($conn); 
    } 

    public function onMessage(ConnectionInterface $from, $msg) { 
     $stack = array(); 
     foreach ($this->clients as $client) { 
      if ($from === $client) { //current client only 
       $query = getNotifications($msg); 
       if($query){ 
        while($row = mysqli_fetch_assoc($query)){ 
         array_push($stack, $row); 
         deleteNotification($row['id'], $msg); 
        } 
        $client->send(json_encode($stack)); 
       } 
      } 
     } 
    } 

    public function onClose(ConnectionInterface $conn) { 
     $this->clients->detach($conn); 
    } 

    public function onError(ConnectionInterface $conn, \Exception $e) { 
     $conn->close(); 
    } 
} 


アイデア:

  1. 私はCが変更を行うとき、それは$client->send()を使用することができますが、私はそれが可能だとは思わないように、データベースに$clientオブジェクトを格納について考えていますか?
  2. $query = getNotifications($msg);コードを内部に持つwhile(true)ループを持つことができます.- の場合、の場合はひどいです。

他にアイデアはありますか?上記を実装する方法もあります。

答えて

1

オブジェクト「X」への更新を検索するクライアントがトピックにサブスクライブし、そのトピックでサーバーを公開するパブリッシュ・サブスクライブ・パターンの使用を検討してください。ラチェットはWAMPv1でこれを処理することができます:http://socketo.me/docs/wampまたははWAMPv2ラチェットの上に構築することができます。

+0

ありがとうございました! wampを使用するより良い例はありますか?私は質問に関連してDOCを理解していません。 – maxisme

関連する問題