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