Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan PHP dan WebSocket untuk melaksanakan fungsi pemesejan segera

Cara menggunakan PHP dan WebSocket untuk melaksanakan fungsi pemesejan segera

王林
王林asal
2023-06-27 13:06:092010semak imbas

Dalam era perkembangan pesat Internet hari ini, permintaan untuk pemesejan segera semakin meningkat. Untuk memenuhi keperluan pengguna dan meningkatkan pengalaman pengguna, banyak tapak web telah menyepadukan fungsi pemesejan segera. Jadi, bagaimana untuk menggunakan PHP dan WebSocket untuk melaksanakan fungsi pemesejan segera? Artikel ini akan memberi anda pengenalan terperinci kepada langkah-langkah tentang cara menggunakan PHP dan WebSocket untuk melaksanakan fungsi pemesejan segera.

1. Fahami protokol WebSocket

WebSocket ialah protokol komunikasi rangkaian baharu berdasarkan protokol TCP Ia boleh mencapai komunikasi dua hala antara pelanggan dan pelayan, seperti digunakan dalam senario pemesejan segera seperti bilik sembang. Dalam protokol HTTP tradisional, pelanggan mesti mendapatkan data dengan menghantar permintaan kepada pelayan, manakala dalam WebSocket, sambungan berterusan diwujudkan antara klien dan pelayan dan data boleh dihantar kepada satu sama lain pada bila-bila masa.

Sebelum menggunakan WebSocket untuk melaksanakan fungsi pemesejan segera, anda perlu memahami protokol WebSocket serta kelebihan dan kekurangannya. Berikut adalah beberapa kelebihan protokol WebSocket:

1 Melalui sambungan yang berterusan, komunikasi dua hala boleh dicapai dengan cepat dan penggunaan jalur lebar dikurangkan.

2 Dengan mengurangkan permintaan HTTP, prestasi pelayan boleh dipertingkatkan.

3 Ujian keserasian boleh dilakukan dalam penyemak imbas yang berbeza dan menyokong berbilang penyemak imbas.

4. Boleh dilaksanakan melalui pelbagai bahasa pengaturcaraan.

Tetapi pada masa yang sama, protokol WebSocket juga mempunyai beberapa kekurangan:

1 Ia belum disokong oleh semua penyemak imbas arus perdana Sebagai contoh, pelayar dengan versi IE yang lebih rendah tidak boleh menyokong protokol WebSocket.

2 Jika terdapat kegagalan dalam sambungan WebSocket, kedua-dua pelayan dan pelanggan perlu menyambung semula.

3. Keselamatan dan privasi perlu dipastikan untuk mengelakkan kebocoran data dan isu lain.

4. Ia mungkin menambahkan beban pada sistem.

2. Cara melaksanakan WebSocket dalam PHP

1. Gunakan perpustakaan Ratchet

Ratchet ialah perpustakaan untuk PHP melaksanakan protokol WebSocket. Ia menyediakan alat untuk pemprosesan permintaan HTTP, pelayan WebSockets. Ratchet boleh digunakan dalam pelbagai persekitaran, seperti rangka kerja Symfony dan Laravel. Kelebihan menggunakan Ratchet ialah anda boleh melaksanakan fungsi WebSocket dengan cepat sambil mengurangkan kesukaran pembangunan dan beban kerja butiran asas.

Berikut ialah langkah-langkah untuk melaksanakan WebSocket menggunakan Ratchet:

(1) Pasang perpustakaan Ratchet

Sebelum menggunakan perpustakaan Ratchet, anda perlu memasang alat Komposer dalam komputer anda. Selepas memasang Komposer, pasang perpustakaan Ratchet melalui alat baris arahan:

composer require cboden/ratchet

(2) Buat pelayan WebSocket

Selepas memasang perpustakaan Ratchet, anda perlu mencipta pelayan WebSocket. Berikut ialah aplikasi Hello World yang ringkas:

<?php
use RatchetServerIoServer;
use RatchetHttpHttpServer;
use RatchetWebSocketWsServer;
use MyAppWebSocketApplication;

require __DIR__ . '/vendor/autoload.php';

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

$server->run();

Dalam kod di atas, WebSocketApplication ialah kelas aplikasi WebSocket yang perlu anda tulis sendiri. Mencipta kelas aplikasi WebSocket memerlukan pelaksanaan antara muka MessageComponentInterface Kaedah yang paling kritikal ialah onMessage(), yang dipanggil apabila mesej klien diterima.

<?php
namespace MyApp;
use RatchetMessageComponentInterface;
use RatchetConnectionInterface;

class WebSocketApplication 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 ($from !== $client) {
                $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();
    }
}

(3) Uji pelayan WebSocket

Selepas melengkapkan langkah di atas, anda boleh menggunakan klien Websocket dalam penyemak imbas untuk menguji, atau anda boleh menggunakan klien WebSocket dalam baris arahan untuk menguji.

2. Gunakan sambungan Swoole

Cara lain untuk PHP melaksanakan protokol WebSocket ialah menggunakan sambungan Swoole. Swoole ialah rangka kerja komunikasi rangkaian berprestasi tinggi yang boleh melaksanakan fungsi WebSocket dengan cepat Ia juga menyediakan Coroutine, MySQL tak segerak dan ciri lain untuk meningkatkan prestasi.

Berikut ialah langkah untuk melaksanakan WebSocket menggunakan sambungan Swoole:

(1) Pasang sambungan Swoole

Mula-mula anda perlu memasang sambungan Swoole dalam komputer anda. Selepas memasang sambungan Swoole, perkenalkan perpustakaan Swoole ke dalam skrip PHP:

require "vendor/autoload.php";

(2) Buat pelayan WebSocket

Kod teras untuk menggunakan Swoole untuk melaksanakan WebSocket adalah seperti berikut:

$server = new SwooleWebSocketServer("127.0.0.1", 8080);

$server->on('open', function (SwooleWebSocketServer $server, $request) {
    echo "server: handshake success with fd{$request->fd}
";
});

$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}
";
    $server->push($frame->fd, "this is server :" . date("Y-m-d H:i:s"));
});

$server->on('close', function ($ser, $fd) {
    echo "client {$fd} closed
";
});

$server->start();

Dalam kod di atas, hidupkan kaedah digunakan untuk mendaftar Buka, mesej, tutup dan acara lain. Selepas klien menyambung ke pelayan WebSocket, pelayan akan memanggil semula acara terbuka Apabila klien menghantar mesej, pelayan akan memanggil semula acara mesej untuk memproses mesej yang dihantar oleh klien. Pada akhirnya, apabila pelanggan menutup sambungan WebSocket, pelayan akan memanggil semula acara tutup.

3. Merangkum kelas alat komunikasi WebSocket

Untuk meningkatkan kebolehgunaan semula kod, kami boleh merangkum fungsi komunikasi WebSocket dalam kelas alat, supaya kod lain boleh melaksanakan komunikasi WebSocket dengan mudah dengan memanggil kaedah kelas alat.

Berikut ialah kelas utiliti WebSocket yang ringkas:

<?php
namespace MyApp;

use RatchetClientWebSocket;
use RatchetRFC6455MessagingFrame;
use ReactEventLoopFactory;
use ReactSocketConnector;
use ReactSocketConnectionInterface;

class WebSocketClient
{
    private $client;
    private $loop;

    public function __construct(string $url)
    {
        $this->loop = Factory::create();
        $this->client = new WebSocket($url, [], $this->loop);
    }

    /**
     * @param $data
     * @param int $opcode
     * @param bool $fin
     */
    public function send($data, $opcode = Frame::OP_TEXT, bool $fin = true)
    {
        $this->client->send(new Frame($data, true, $opcode, $fin));
    }

    /**
     * @return WebSocket
     */
    public function getClient(): WebSocket
    {
        return $this->client;
    }

    /**
     * @return ReactEventLoopLoopInterface
     */
    public function getLoop(): ReactEventLoopLoopInterface
    {
        return $this->loop;
    }

    /**
     * @param ConnectionInterface $conn
     */
    public function onClose(ConnectionInterface $conn)
    {
        echo "Connection closed: {$conn->getRemoteAddress()}
";
    }

    public function run()
    {
        $this->client->connect()
            ->then(function (WebSocket $conn) {
                echo "Connected
";
                $this->send('Hello, World!');
                $conn->on('message', function (Frame $msg) use ($conn) {
                    echo "Received: {$msg}
";
                    $conn->close();
                });
                $conn->on('close', function ($code = null, $reason = null) {
                    echo "Connection closed ({$code} - {$reason})
";
                });
            }, function (Throwable $e) {
                echo "Could not connect: {$e->getMessage()}
";
            });

        $this->loop->run();
    }
}

Dalam kod di atas, kami mentakrifkan kelas WebSocketClient, yang boleh mencipta klien WebSocket dan menyambung ke pelayan yang ditentukan. Pada masa yang sama, ia juga menyediakan kaedah seperti hantar dan onClose untuk menghantar data dan mengendalikan acara tertutup sambungan WebSocket. Selepas mencipta klien WebSocket, kami menggunakan mod Promise untuk memproses acara sambungan, mendengar mesej dan menutup acara dan memproses peristiwa yang sepadan apabila ia dicetuskan.

4. Ringkasan

Artikel ini memperkenalkan anda secara terperinci cara menggunakan PHP dan WebSocket untuk melaksanakan fungsi pemesejan segera, dan menggariskan ciri dan kekurangan protokol WebSocket untuk anda. Dengan menggunakan perpustakaan Ratchet dan sambungan Swoole, anda boleh melaksanakan fungsi WebSocket dengan cepat. Pada masa yang sama, untuk meningkatkan kebolehgunaan semula komunikasi WebSocket, kami juga menunjukkan kepada anda cara merangkum kelas alat komunikasi klien WebSocket. Saya harap artikel ini berguna kepada anda, terima kasih kerana membaca.

Atas ialah kandungan terperinci Cara menggunakan PHP dan WebSocket untuk melaksanakan fungsi pemesejan segera. 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