2016-12-12 17 views
-1

Я использую Ratchett для создания сокетов на моем веб-сервере с PHP.Как обрабатывать сокеты в PHP

В настоящее время у меня есть - сервер, B - устройство ищет изменения в базе данных (в ) и C - это устройство делает изменения в базе данных (в ) с запросом curl.

В настоящее время, когда C делает изменение, которое я сохранить изменения в базе данных по . Среднее время как В проверяют каждую секунду с через сокет, существует ли элемент в базе данных, отправив запрос на , в котором возвращает ответ. Это талия B s ресурсы. Мне нужен способ, когда C делает изменение для сокета для обновления B.

Это код для сокета:

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

Где getNotifications() получает изменения в базе данных и deleteNotification() удаляет его.


Идея:

  1. Я думал о хранении $client объекта в базе данных, так что, когда C делает изменения можно использовать $client->send(), но я не думаю, что это возможно?
  2. Я мог бы иметь петлю while(true) с кодом $query = getNotifications($msg); внутри - awful для A.

Есть ли у вас какие-либо другие идеи? Или способы реализации вышеизложенного.

ответ

1

Рассмотрите возможность использования шаблона публикации-подписки, где клиент, ищущий обновления для объекта «X», подписывается на тему, а затем публикует сервер в этой теме. Ratchet может справиться с этим с помощью WAMPv1: http://socketo.me/docs/wamp или вы можете использовать Thruway, который является WAMPv2, установленным поверх храпового механизма.

+0

Спасибо! Есть ли у вас лучшие примеры использования wamp? Я не понимаю там DOC по отношению к моему вопросу. – maxisme

 Смежные вопросы

  • Нет связанных вопросов^_^