Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan WebSocket dalam PHP?

Bagaimana untuk menggunakan WebSocket dalam PHP?

WBOY
WBOYasal
2023-05-12 08:27:111500semak imbas

Apabila aplikasi web menjadi lebih kompleks, komunikasi masa nyata dan dorongan data menjadi lebih biasa. Di sinilah WebSocket masuk. WebSocket ialah protokol yang membolehkan pelayan dan pelanggan mewujudkan sambungan berterusan untuk komunikasi dua hala untuk komunikasi masa nyata dan tolakan data. Dalam artikel ini, kita akan membincangkan cara menggunakan WebSocket dalam PHP.

  1. Pengenalan kepada protokol WebSocket

WebSocket ialah protokol berasaskan TCP dupleks penuh yang membolehkan pelayan dan klien berkomunikasi dalam masa nyata selepas sambungan diwujudkan. Tidak seperti model respons permintaan HTTP, sambungan WebSocket sentiasa kekal terbuka selepas sambungan diwujudkan, jadi berbilang jabat tangan HTTP tidak diperlukan.

WebSocket ialah protokol binari yang menyokong berbilang jenis data, termasuk teks, binari, JSON, XML, dsb. Ini menjadikan WebSocket ideal untuk komunikasi masa nyata dan menolak data.

  1. Pasang perpustakaan WebSocket

Menggunakan WebSocket dalam PHP memerlukan penggunaan perpustakaan. Dalam artikel ini, kami akan menggunakan perpustakaan Ratchet. Untuk memasang Ratchet, anda boleh menjalankan arahan berikut melalui Composer:

composer require cboden/ratchet

Setelah pemasangan selesai, kami boleh mula menulis kod untuk melaksanakan aplikasi WebSocket.

  1. Melaksanakan perkhidmatan WebSocket

Di bawah ialah contoh mudah untuk melaksanakan perkhidmatan WebSocket yang akan menerima mesej daripada pelanggan dan menghantar mesej kepada Semua pelanggan yang disambungkan:

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

class Chat implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "New client connected: {$conn->resourceId}
";
    }

    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo "Client disconnected: {$conn->resourceId}
";
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        foreach ($this->clients as $client) {
            if ($client !== $from) {
                $client->send($msg);
            }
        }
    }

    public function onError(ConnectionInterface $conn, Exception $e) {
        echo "Error: {$e->getMessage()}
";
        $conn->close();
    }
}

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8080
);

echo "Server started
";
$server->run();

Dalam contoh di atas, kami telah menentukan kelas yang dipanggil Chat, yang melaksanakan antara muka MessageComponentInterface. Kelas ini mengandungi kaedah khas untuk mengendalikan sambungan, pemutusan sambungan dan mesej daripada pelanggan.

onOpen(ConnectionInterface $conn): Kaedah ini dipanggil apabila klien menyambung ke pelayan. Di sini kami menambah sambungan kepada objek klien.

onClose(ConnectionInterface $conn): Kaedah ini dipanggil apabila klien menutup sambungan. Di sini kami memadamkan objek klien sambungan.

onMessage(ConnectionInterface $from, $msg): Kaedah ini dipanggil apabila pelanggan menghantar mesej. Di sini kami menghantar mesej kepada pelanggan lain yang berkaitan.

onError(ConnectionInterface $conn, Exception $e): Kaedah ini dipanggil apabila ralat berlaku. Kami menutup sambungan di sini.

Dalam contoh di atas, kami juga mencipta pelayan HTTP melalui kelas IoServer, mendengar port 8080, menghantar permintaan ke pelayan WebSocket melalui HttpServer dan menghantar permintaan ke kelas Chat melalui WsServer.

  1. Melaksanakan klien

Untuk menyambung ke pelayan WebSocket kami, anda perlu melaksanakan klien. Berikut ialah contoh mudah untuk menyambung ke pelayan dan menghantar mesej kepadanya:

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket client</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <input type="text" id="message" placeholder="Enter your message">
    <button id="send">Send</button>

    <ul id="messages"></ul>

    <script>
        $(function () {
            var socket = new WebSocket('ws://localhost:8080');

            socket.onopen = function() {
                console.log('Connection opened');
            };

            socket.onclose = function() {
                console.log('Connection closed');
            };

            socket.onmessage = function(event) {
                var data = JSON.parse(event.data);
                $('#messages').append($('<li>').text(data.message));
            };

            $('#send').click(function() {
                var message = $('#message').val();
                socket.send(JSON.stringify({message: message}));
            });
        });
    </script>
</body>
</html>

Dalam contoh di atas, kami mencipta sambungan WebSocket baharu menggunakan objek WebSocket. Apabila sambungan dibuka atau ditutup, peristiwa onopen dan onclose dicetuskan. Apabila WebSocket menerima mesej daripada pelayan, acara onmessage akan dicetuskan. Kami menggunakan perpustakaan jQuery untuk mendengar acara klik butang Hantar, dan apabila diklik, kami menghantar nilai kotak input teks sebagai mesej kepada pelayan.

  1. Ringkasan

WebSocket ialah protokol berkuasa yang membolehkan pelayan dan klien mewujudkan sambungan berterusan untuk komunikasi dua hala bagi mencapai komunikasi masa nyata dan tolakan data. Dalam artikel ini, kami melaksanakan pelayan WebSocket mudah menggunakan perpustakaan Ratchet. Kami juga menggunakan halaman HTML ringkas untuk menunjukkan cara menyambung ke pelayan dan menghantar mesej. Jika anda ingin membina aplikasi web interaktif masa nyata, maka WebSocket adalah bahagian yang sangat diperlukan.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan WebSocket dalam PHP?. 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