Avec le développement continu de la technologie Internet, nos exigences de performances pour les applications réseau sont de plus en plus élevées. Partant de ce principe, le service push côté serveur, en tant que solution de communication en temps réel, est adopté par de plus en plus d'applications. Cet article explique comment utiliser Memcache et PHP pour implémenter des services push côté serveur hautes performances.
1. Qu'est-ce que le service push côté serveur ?
Le service push côté serveur signifie que le serveur envoie activement des données au client sans exiger que le client demande activement des données. Par exemple, dans un salon de discussion, après qu'un utilisateur a envoyé un message, tous les utilisateurs en ligne peuvent recevoir le message sans que chaque utilisateur ait à le demander. Cela peut considérablement améliorer les performances en temps réel et également réduire la pression sur le serveur.
2. Le rôle de Memcache
Memcache est un outil de mise en cache des données. Sa fonction est de stocker les données en mémoire pour accélérer la lecture et l'écriture des données. Dans le service push côté serveur, le rôle de Memcache est de mettre en cache les messages qui doivent être envoyés pour réduire la pression sur le serveur et la base de données.
3. Utilisez PHP pour implémenter le service push côté serveur
Ensuite, nous utiliserons PHP pour implémenter le service push côté serveur. Cet article supposera que nous disposons déjà d'un système de salle de discussion, qui contient les trois parties suivantes :
La liste des utilisateurs en ligne fait référence à la liste des utilisateurs actuellement dans la salle de discussion. Nous devons mettre en cache la liste des utilisateurs en ligne dans Memcache pour un accès rapide.
La liste des messages fait référence à la liste des messages envoyés par tous les utilisateurs. Nous devons mettre en cache la liste des messages dans Memcache pour un accès rapide. Dans le même temps, nous devons ajouter un champ d'horodatage à la liste des messages pour permettre au client de déterminer s'il y a de nouveaux messages.
Le service Push fait référence à un service qui envoie activement des messages qui doivent être poussés au client. Dans notre système, nous utiliserons WebSocket pour implémenter le service push.
Voici les étapes détaillées de mise en œuvre :
Nous pouvons ajouter l'utilisateur à la liste des utilisateurs en ligne lorsqu'il se connecte. Ensuite, lorsque l'utilisateur se déconnecte, supprimez-le de la liste des utilisateurs en ligne. La liste des utilisateurs en ligne est mise en cache comme suit :
$memcache = new Memcache;
$memcache->addServer('localhost', 11211);
// Ajouter la liste des utilisateurs en ligne au cache
$onlineUsers = array( 'user1' , 'user2', 'user3');
$memcache->set('online_users', $onlineUsers, 0, 0);
// Récupérer la liste des utilisateurs en ligne à partir du cache
$onlineUsers = $ memcache-> get('online_users');
Nous pouvons l'ajouter à la liste des messages lorsque l'utilisateur envoie un message. Ensuite, dans le service push, envoyez la liste des messages au client. Nous devons ajouter un champ d'horodatage à la liste des messages pour permettre au client de déterminer s'il y a de nouveaux messages. La liste des messages est mise en cache comme suit :
$memcache = new Memcache;
$memcache->addServer('localhost', 11211);
// Ajouter la liste des messages au cache
$messages = array(
array('user' => 'user1', 'message' => 'hello', 'timestamp' => time()), array('user' => 'user2', 'message' => 'world', 'timestamp' => time())
);
$memcache->set('messages', $messages, 0, 0);
// Récupère la liste des messages du cache
$messages = $memcache->get('messages');
Nous utiliserons WebSocket pour implémenter le service push. WebSocket est un protocole de communication en temps réel qui peut être utilisé dans les navigateurs modernes. En PHP, nous pouvons utiliser Ratchet pour implémenter WebSocket. Voici comment le service push est implémenté :
//Introduire la bibliothèque Ratchet
require __DIR__.'/vendor/autoload.php';
use RatchetMessageComponentInterface
use RatchetConnectionInterface
// WebSocket push service
class Chat; implémente 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) { $memcache = new Memcache; $memcache->addServer('localhost', 11211); // 获取在线用户列表和消息列表 $onlineUsers = $memcache->get('online_users'); $messages = $memcache->get('messages'); // 发送消息给所有客户端 foreach ($this->clients as $client) { $client->send(json_encode(array( 'type' => 'message', 'online_users' => $onlineUsers, 'messages' => $messages ))); } } public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); } public function onError(ConnectionInterface $conn, Exception $e) { $conn->close(); }
}
// Créez un serveur WebSocket et démarrez
$app = new RatchetApp('localhost', 8080);
$app->route('/chat', new Chat);
$ app-> ;run();
4. Implémentation côté client
Le client peut être implémenté à l'aide de n'importe quel navigateur moderne. Voici le code HTML et JavaScript du client :
<. ;html>
<title>WebSocket Chat</title>
<ul id="messages"></ul> <form action=""> <input id="message" type="text"> <button>Send</button> </form> <script> var ws = new WebSocket("ws://localhost:8080/chat"); ws.onmessage = function(event) { var data = JSON.parse(event.data); // 更新在线用户列表 var onlineUsers = data.online_users; for (var i = 0; i < onlineUsers.length; i++) { // add online user to list } // 更新消息列表 var messages = data.messages; for (var i = 0; i < messages.length; i++) { // add message to list } }; document.querySelector("form").addEventListener("submit", function(event) { event.preventDefault(); var input = document.querySelector("input#message"); ws.send(input.value); input.value = ""; }); </script>