Pembangunan PHP kumpulan pengguna dan fungsi langganan sistem sembang masa nyata
Dalam era Internet sosial hari ini, sistem sembang masa nyata telah menjadi alat penting untuk komunikasi harian orang ramai. Untuk memberikan pengalaman pengguna yang lebih baik, kami perlu melaksanakan fungsi kumpulan pengguna dan langganan supaya pengguna boleh membuat dan menyertai kumpulan dengan mudah serta melanggan kandungan yang diminati.
Artikel ini akan memperkenalkan cara menggunakan PHP untuk membangunkan kumpulan pengguna dan fungsi langganan sistem sembang masa nyata. Kami akan menggunakan WebSocket untuk melaksanakan fungsi komunikasi masa nyata dan menggabungkannya dengan pangkalan data MySQL untuk mengendalikan maklumat pengguna dan kumpulan.
Pertama, kita perlu membina rangka kerja sistem sembang masa nyata asas. Berikut ialah contoh pelayan WebSocket mudah, dilaksanakan menggunakan perpustakaan Ratchet:
require 'vendor/autoload.php'; use RatchetMessageComponentInterface; use RatchetConnectionInterface; use RatchetServerIoServer; use RatchetHttpHttpServer; use RatchetWebSocketWsServer; class Chat implements MessageComponentInterface { protected $clients; protected $groups; public function __construct() { $this->clients = new SplObjectStorage; $this->groups = array(); } public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); echo "New connection: ({$conn->resourceId}) "; } public function onMessage(ConnectionInterface $from, $msg) { // 处理收到的消息 } public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); echo "Connection {$conn->resourceId} has disconnected "; } public function onError(ConnectionInterface $conn, Exception $e) { echo "An error has occurred: {$e->getMessage()} "; $conn->close(); } } $server = IoServer::factory( new HttpServer( new WsServer( new Chat() ) ), 8080 ); $server->run();
Contoh di atas mencipta kelas WebSocket bernama Chat untuk mengendalikan acara pembukaan, pemesejan dan penutup sambungan. Di mana $this->clients
ialah objek SplObjectStorage
yang menyimpan semua sambungan klien dan $this->groups
ialah Array simpan kumpulan maklumat. $this->clients
是一个保存所有客户端连接的SplObjectStorage
对象,$this->groups
是一个保存群组信息的数组。
接下来,我们需要添加一些方法来实现用户加入群组和订阅功能。在Chat类中添加以下代码:
public function joinGroup(ConnectionInterface $conn, $groupId) { // 将用户加入群组 $this->groups[$groupId][] = $conn; echo "User ({$conn->resourceId}) joined group {$groupId} "; } public function leaveGroup(ConnectionInterface $conn, $groupId) { // 将用户从群组中移除 $index = array_search($conn, $this->groups[$groupId]); if ($index !== false) { unset($this->groups[$groupId][$index]); echo "User ({$conn->resourceId}) left group {$groupId} "; } } public function subscribe(ConnectionInterface $conn, $topic) { // 订阅某个主题 $conn->topics[] = $topic; echo "User ({$conn->resourceId}) subscribed to {$topic} "; } public function unsubscribe(ConnectionInterface $conn, $topic) { // 取消订阅某个主题 $index = array_search($topic, $conn->topics); if ($index !== false) { unset($conn->topics[$index]); echo "User ({$conn->resourceId}) unsubscribed from {$topic} "; } }
以上代码中,joinGroup
方法将用户加入指定的群组,leaveGroup
方法将用户从群组中移除,subscribe
方法将用户订阅指定的主题,unsubscribe
CREATE TABLE `users` ( `id` int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY, `name` varchar(255) NOT NULL, `email` varchar(255) NOT NULL ); CREATE TABLE `groups` ( `id` int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY, `name` varchar(255) NOT NULL ); CREATE TABLE `group_user` ( `group_id` int(11) UNSIGNED NOT NULL, `user_id` int(11) UNSIGNED NOT NULL, PRIMARY KEY (`group_id`, `user_id`), FOREIGN KEY (`group_id`) REFERENCES `groups`(`id`), FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) );
joinGroup
menambah pengguna kepada kumpulan yang ditentukan dan kaedah leaveGroup
mengalih keluar pengguna daripada kumpulan. Kaedah langgan
melanggan pengguna kepada topik tertentu dan kaedah nyahlanggan
membatalkan langganan pengguna kepada topik. Apabila pengguna menyertai kumpulan atau melanggan topik, kami perlu menyimpan maklumat yang berkaitan ke pangkalan data. Berikut ialah contoh struktur jadual pangkalan data untuk menyimpan maklumat pengguna dan kumpulan: public function joinGroup(ConnectionInterface $conn, $groupId) { // 将用户加入群组 // ... // 将用户加入数据库 $userId = $_SESSION['user_id']; // 假设用户登录时已经保存用户ID到session中 $query = "INSERT INTO group_user (group_id, user_id) VALUES (?, ?)"; $stmt = $mysqli->prepare($query); $stmt->bind_param("ii", $groupId, $userId); $stmt->execute(); } public function subscribe(ConnectionInterface $conn, $topic) { // 订阅某个主题 // ... // 将订阅信息保存到数据库 $userId = $_SESSION['user_id']; $query = "INSERT INTO subscriptions (user_id, topic) VALUES (?, ?)"; $stmt = $mysqli->prepare($query); $stmt->bind_param("is", $userId, $topic); $stmt->execute(); }
rrreee
Kami juga boleh melaksanakan beberapa fungsi lain, seperti mendapatkan kumpulan pengguna atau topik yang dilanggan daripada pangkalan data, dan menghantar mesej yang diterima ke sambungan yang berkaitan. 🎜🎜Melalui pelaksanaan di atas, kami telah berjaya melaksanakan kumpulan pengguna dan fungsi langganan dalam sistem sembang masa nyata yang dibangunkan dalam PHP. Dengan cara ini, pengguna boleh membuat dan menyertai kumpulan dengan mudah, melanggan kandungan yang diminati dan mendapat pengalaman komunikasi yang lebih baik dalam sistem sembang masa nyata. 🎜Atas ialah kandungan terperinci PHP membangunkan kumpulan pengguna dan fungsi langganan sistem sembang masa nyata. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!