La technologie de messagerie en temps réel peut aider les sites Web et les applications à obtenir une expérience d'interaction utilisateur plus efficace. Par exemple, lorsque les utilisateurs utilisent le service client en ligne, la salle de discussion ou le système de notification en temps réel, ils doivent recevoir des messages du serveur dès que possible. Bien que WebSocket soit actuellement la technologie de communication en temps réel grand public, en raison d'un mauvais support pour certains serveurs ou environnements, l'utilisation de PHP combinée à un long sondage est toujours une alternative pratique et réalisable.
La clé de la poussée de message est de maintenir une communication continue entre le client et le serveur. La communication HTTP traditionnelle est une réponse à sens unique, tandis que le sondage long retarde la réponse après que le client a publié une demande, réalisant ainsi un effet approximatif en temps réel.
Le processus de communication des sondages longs peut être divisé en étapes suivantes:
Nous devons d'abord concevoir une table de base de données pour stocker les messages. Par exemple, vous pouvez créer le tableau "Messages" suivant:
CREATE TABLE messages (
id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
content VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
La page frontale est utilisée pour afficher les messages en temps réel poussés et peut être traité à l'aide de HTML et JavaScript en conjonction avec jQuery:
<!DOCTYPE html>
<html>
<head>
<title>Push de message en temps réel</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="app.js"></script>
</head>
<body>
<div id="messages"></div>
</body>
</html>
Le code PHP backend est responsable de la gestion de la logique de sondage longue et de la réponse aux données. Nous pouvons créer un fichier nommé index.php pour gérer les demandes initiées par le frontal.
<?php
// Connexion de base de données
$conn = new mysqli("localhost", "nom d'utilisateur", "mot de passe", "Nom de base de données");
if ($conn->connect_error) {
die("Échec de la connexion: " . $conn->connect_error);
}
// Obtenez le dernier message reçu la dernière foisID
$lastId = isset($_GET['last_id']) ? intval($_GET['last_id']) : 0;
$timeout = 30; // Attendez au plus30Deuxième
$startTime = time();
while (true) {
$sql = "SELECT * FROM messages WHERE id > $lastId ORDER BY id ASC";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
$messages = [];
while($row = $result->fetch_assoc()) {
$messages[] = $row;
}
echo json_encode(["status" => "success", "data" => $messages]);
break;
} else {
// Tous les autres1Deuxième检查一次是否有新消息,Évitez la pression excessive du serveur
sleep(1);
}
if ((time() - $startTime) > $timeout) {
echo json_encode(["status" => "timeout", "data" => []]);
break;
}
}
$conn->close();
?>
let lastId = 0;
function fetchMessages() {
$.ajax({
url: 'index.php',
type: 'GET',
data: { last_id: lastId },
success: function(response) {
if (response.status === 'success') {
response.data.forEach(function(msg) {
$('#messages').append('<p>' + msg.content + '</p>');
lastId = msg.id;
});
}
fetchMessages();
},
error: function() {
setTimeout(fetchMessages, 3000);
}
});
}
$(document).ready(function() {
fetchMessages();
});
Grâce aux méthodes ci-dessus, nous avons réussi à construire un système de poussée de messagerie en temps réel de base en utilisant PHP et une technologie de sondage longue. Cette solution a une bonne compatibilité et un faible seuil de développement, et convient aux projets qui ne prennent pas en charge les environnements WebSocket. Il s'agit d'une solution à adopter pour les scénarios d'application qui nécessitent de faibles performances en temps réel mais nécessitent des commentaires en temps opportun.