/**
  * Notifie les clients des topics modifiés si nécessaire.
  */
 private function pushTopicsUpdate($serializedUpdatedTopics)
 {
     $this->logger->ln("Notification de mise a jour des topics aux clients...", 2);
     $updatedTopics = unserialize(SocketMessage::uncompress($serializedUpdatedTopics));
     $this->logger->ln("recu : " . print_r($updatedTopics, true), 3);
     //On parcourt les mises à jour de topics
     foreach ($updatedTopics as $updatedTopic) {
         if (!isset($this->topics[$updatedTopic->getId()])) {
             continue;
         }
         $currentTopic = $this->topics[$updatedTopic->getId()];
         $this->logger->ln("Verification du topic {$updatedTopic->getId()}...", 3);
         //On ne traite pas les topics en erreur
         if ($updatedTopic->error) {
             //En revanche, on repasse le nombre de pages du topic à 1.
             //Ceci pour éviter qu'un topic soit tout le temps en erreur à cause d'une
             //suppression de message qui a entrainé un nombre de page inférieur.
             $updatedTopic->setPageCount(1);
             $this->logger->ln("Erreur pour le topic {$updatedTopic->getId()}...", 3);
             continue;
         }
         $this->logger->ln("Données à jour : " . print_r($updatedTopic, true) . "...", 3);
         $this->logger->ln("Données actuelles : " . print_r(unserialize(serialize($currentTopic)), true) . "...", 3);
         //On détermine si on doit pousser la nouvelle info aux clients (le nombre de posts a changé
         //  ou le topic vient d'être locké).
         if (!$currentTopic->isLocked() && $updatedTopic->isLocked() || $currentTopic->getPostCount() !== $updatedTopic->getPostCount()) {
             $this->logger->ln("Topic {$updatedTopic->getId()} modifie !", 2);
             //On met à jour le topic
             $currentTopic->setPostCount($updatedTopic->getPostCount());
             $currentTopic->setPageCount($updatedTopic->getPageCount());
             $currentTopic->setLocked($updatedTopic->isLocked());
             $currentTopic->setDataFetched(true);
             //On envoie les données aux followers si besoin
             $currentTopic->sendInfosToFollowers();
         }
     }
 }
Ejemplo n.º 2
0
 /**
  * Envoie les infos du topic à une connexion en particulier.
  */
 public function sendInfosTo($follower)
 {
     $message = SocketMessage::fromData('topicInfos', $this->getInfos());
     $follower->send($message->toJson());
 }
 /**
  * Récupère la mises à jour des topics et les communique au serveur principal
  */
 private function getTopicUpdates($serializedTopics)
 {
     $topics = unserialize(SocketMessage::uncompress($serializedTopics));
     $this->logger->ln('Mise a jour de ' . count($topics) . ' topics...', 2);
     //On reset les topics
     $this->curlm->clearTopics();
     foreach ($topics as $topic) {
         $this->logger->ln("Topic '{$topic->getId()}' marque pour mise a jour", 3);
         $this->curlm->addTopic($topic);
     }
     //Récupération des infos des topics
     $topics = $this->curlm->getUpdatedTopics();
     //On envoie les infos au serveur principal
     $updateMessage = SocketMessage::fromData("topicsUpdate", SocketMessage::compress(serialize($topics)));
     $this->mainServerConnection->send($updateMessage->toJson());
 }