2016-12-12 4 views
-1

Ich verwende Ratchett, um Sockets auf meinem Webserver mit PHP zu erstellen.Umgang mit Sockets in PHP

Zur Zeit habe ich A - der Server, B - eine Vorrichtung für eine Änderung in einer Datenbank suchen (in A) und C - ein Gerät die Änderung auf der Datenbank zu machen (in A) mit einer curl Anfrage. Derzeit

wenn C die Änderung macht speichere ich die Änderung in der Datenbank auf A. Mittel, während B wird jede Sekunde mit A durch eine Buchse Prüfen, ob ein Artikel in der Datenbank, indem eine Anfrage an Senden einer in denen A eine Antwort zurückgibt. Dies ist eine Taille von B s Ressourcen. Ich brauche einen Weg für, wenn C eine Änderung für den zu aktualisierenden Sockel macht B.

Dies ist der Code für die Steckdose:

<?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(); 
    } 
} 

Wo getNotifications() die Änderung in der Datenbank erhält und deleteNotification() löscht sie.


Ideen:

  1. Ich habe darüber nachgedacht, das $client Objekt in einer Datenbank zu speichern, so dass, wenn C die Änderung macht es $client->send() verwenden kann, aber ich glaube nicht, ist das möglich?
  2. Ich könnte eine while(true) Schleife mit dem $query = getNotifications($msg); Code innerhalb haben - schrecklich für A.

Haben Sie noch andere Ideen? Oder Möglichkeiten, das oben genannte zu implementieren.

Antwort

1

Verwenden Sie ein Publish-Subscribe-Muster, bei dem ein Client, der nach Aktualisierungen für ein Objekt "X" sucht, ein Thema abonniert und den Server dann zu diesem Thema veröffentlichen lässt. Ratchet kann dies mit WAMPv1: http://socketo.me/docs/wamp oder Sie können Thruway verwenden, die WAMPv2 auf der Oberseite der Ratsche gebaut ist.

+0

Vielen Dank! Haben Sie bessere Beispiele für die Verwendung von Wamp? Ich verstehe DOCs nicht in Bezug auf meine Frage. – maxisme