Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Contoh pembangunan PHP WebSocket: contoh praktikal tentang cara melaksanakan fungsi tertentu

Contoh pembangunan PHP WebSocket: contoh praktikal tentang cara melaksanakan fungsi tertentu

WBOY
WBOYasal
2023-09-12 13:27:271292semak imbas

PHP WebSocket开发实例:如何实现特定功能的实践案例

Contoh pembangunan PHP WebSocket: kes praktikal tentang cara melaksanakan fungsi tertentu

Dalam beberapa tahun kebelakangan ini, dengan peningkatan kerumitan aplikasi Web, protokol HTTP tradisional telah menunjukkan beberapa kelemahan dalam komunikasi masa nyata. Untuk memenuhi keperluan komunikasi masa nyata, WebSocket wujud.

WebSocket ialah protokol untuk komunikasi dupleks penuh melalui sambungan TCP tunggal, yang membolehkan pelayan menolak data secara aktif kepada klien tanpa pelanggan menghantar permintaan. Ini menjadikan komunikasi masa nyata, permainan dalam talian, pemantauan masa nyata dan aplikasi lain lebih mudah dan cekap.

Dalam artikel ini, kami akan memperkenalkan contoh pembangunan WebSocket berdasarkan PHP Melalui kes ini, kami akan mempelajari proses praktikal bagaimana untuk melaksanakan fungsi tertentu.

Andaikan kami ingin membangunkan aplikasi bilik sembang dalam talian Pengguna boleh menghantar mesej di halaman web, dan pengguna lain boleh menerima dan membalas dengan segera. Fungsi ini melibatkan perkara penting berikut:

  1. Pembinaan pelayan WebSocket
  2. Komunikasi antara pelanggan dan pelayan
  3. Menghantar dan menerima mesej
  4. Penyelenggaraan senarai pengguna

Pertama, kita perlu membina Web. Dalam PHP, kita boleh menggunakan perpustakaan Ratchet untuk melaksanakan fungsi WebSocket. Pasang Ratchet melalui Komposer:

composer require cboden/ratchet

Seterusnya, buat fail server.php dan tulis kod berikut:

<?php

require 'vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
use RatchetServerIoServer;
use RatchetHttpHttpServer;
use RatchetWebSocketWsServer;

class Chat implements MessageComponentInterface {
    protected $clients;
    
    public function __construct() {
        $this->clients = new SplObjectStorage;
    }
    
    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "New connection! ({$conn->resourceId})
";
    }
    
    public function onMessage(ConnectionInterface $from, $msg) {
        // 处理消息,比如将消息发送给其他在线用户
        foreach ($this->clients as $client) {
            if ($client !== $from) {
                $client->send($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();

Kod ini mencipta kelas Sembang dan melaksanakan antara muka MessageComponentInterface Kami boleh mentakrifkan pelbagai fungsi pengendalian acara. Seterusnya, kami perlu menghantar mesej kepada pengguna dalam talian yang lain Di sini kami menggunakan gelung foreach untuk melintasi semua pelanggan yang disambungkan dan menentukan sama ada ia adalah klien sumber itu sendiri.

Jalankan php server.php dalam baris arahan, dan pelayan WebSocket akan bermula.

Seterusnya, kita perlu melaksanakan komunikasi dengan pelayan di halaman web. Pada halaman web, kita boleh menggunakan JavaScript untuk mencipta objek WebSocket untuk berkomunikasi dengan bahagian belakang.

<script>
var conn = new WebSocket('ws://localhost:8080');

conn.onopen = function() {
    console.log('Connected!');
}

conn.onmessage = function(e) {
    console.log('Received: ' + e.data);
}

function sendMessage() {
    var message = document.getElementById('input').value;
    conn.send(message);
}
</script>

Kod di atas mencipta objek WebSocket dan mentakrifkan fungsi pengendali untuk acara onopen dan onmessage. Selepas memasukkan mesej dalam kotak input, klik butang hantar untuk memanggil fungsi sendMessage untuk menghantar mesej ke pelayan.

Akhir sekali, kita perlu mengekalkan senarai pengguna untuk memaparkan pengguna dalam talian dan mengemas kini senarai pengguna. Kami boleh menambah logik yang sepadan pada acara onOpen dan onClose pada bahagian pelayan:

public function onOpen(ConnectionInterface $conn) {
    $this->clients->attach($conn);
    echo "New connection! ({$conn->resourceId})
";
    
    // 将新用户加入用户列表,并广播给其他在线用户
    foreach ($this->clients as $client) {
        $client->send('New user has joined');
    }
}

public function onClose(ConnectionInterface $conn) {
    $this->clients->detach($conn);
    echo "Connection {$conn->resourceId} has disconnected
";
    
    // 将离线用户从用户列表中删除,并广播给其他在线用户
    foreach ($this->clients as $client) {
        $client->send('A user has left');
    }
}

Melalui kod di atas, apabila pengguna baharu menyertai dan pengguna pergi ke luar talian, kami akan menyiarkan mesej yang sepadan kepada pengguna dalam talian lain untuk mengemas kini senarai pengguna.

Ringkasnya, kami telah mempelajari cara menggunakan PHP WebSocket untuk melaksanakan proses pembangunan fungsi tertentu melalui contoh bilik sembang dalam talian. Sudah tentu, WebSocket juga boleh digunakan dalam pelbagai bidang yang lebih luas, seperti pemberitahuan tolak, permainan dalam talian, pemantauan masa nyata, dsb. Saya harap kes praktikal dalam artikel ini dapat membantu pembelajaran dan perkembangan anda!

Atas ialah kandungan terperinci Contoh pembangunan PHP WebSocket: contoh praktikal tentang cara melaksanakan fungsi tertentu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn