Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menangani Long Polling dan WebSocket dalam pembangunan API PHP

Bagaimana untuk menangani Long Polling dan WebSocket dalam pembangunan API PHP

PHPz
PHPzasal
2023-06-17 08:52:141287semak imbas

Dengan pembangunan Internet dan Internet mudah alih, semakin banyak aplikasi perlu melaksanakan fungsi komunikasi masa nyata. Dalam pembangunan web, Long Polling dan WebSocket ialah dua protokol yang biasa digunakan yang boleh melaksanakan fungsi komunikasi masa nyata. Dalam pembangunan API PHP, cara menangani Long Polling dan WebSocket adalah isu yang perlu dipertimbangkan.

1. Tinjauan Panjang

Tinjauan Panjang ialah teknologi yang membolehkan komunikasi masa nyata. Prinsip asasnya ialah pelanggan menghantar permintaan kepada pelayan, dan pelayan tidak bertindak balas kepada permintaan itu dengan segera, sebaliknya, ia memastikan sambungan terbuka dan menunggu data baharu sebelum mengembalikannya kepada klien kemudiannya selepas menerima data.

Dalam pembangunan API PHP, kaedah mengendalikan Tinjauan Panjang adalah serupa dengan mengendalikan permintaan biasa, kecuali anda perlu memastikan sambungan terbuka dan menunggu data dikembalikan. Berikut ialah contoh kod:

<?php
// 开启一个长轮询连接
while(true) {
    // 查询是否有新的数据
    $new_data = get_new_data();
    if(!empty($new_data)) {
        // 返回查询到的新数据
        echo json_encode($new_data);
        // 关闭连接,等待下一次请求
  exit;
    }
    // 等待一段时间再次查询
    sleep(1);
}
?>

Dalam kod di atas, kami menggunakan gelung sementara untuk memastikan sambungan terbuka, menunggu data baharu dikembalikan kepada klien dan tunggu seketika untuk bertanya semula sama ada ada data baru. Kaedah ini tidak sesuai untuk senario konkurensi tinggi kerana setiap sambungan akan menduduki proses. Jika terdapat ramai pelanggan melakukan tinjauan panjang pada masa yang sama, pelayan akan cepat habis.

Untuk menyelesaikan masalah ini, kami boleh menggunakan pendengar Acara atau baris gilir mesej untuk mengendalikan permintaan Undian Panjang. Apabila terdapat data baharu, cetuskan pendengar Acara atau tolak ke baris gilir mesej, dan kemudian gunakan sambungan tinjauan pendapat yang panjang untuk mendapatkan data. Ini boleh mengurangkan beban pada pelayan dan meningkatkan kestabilan sistem. Berikut ialah contoh kod yang menggunakan Redis untuk mengendalikan permintaan Undian Panjang:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);

// 开启一个长轮询连接
while(true) {
    $new_data = $redis->subscribe(['new_data']);
    if(!empty($new_data)) {
        // 返回新数据
        echo json_encode($new_data);
        // 关闭连接,等待下一次请求
  exit;
    }
}
?>

Dalam kod di atas, kami menggunakan kaedah langgan Redis untuk memantau dorongan data baharu, dan apabila terdapat data baharu, kembalikan kepada pelanggan dan keluar dari sambungan. Kaedah ini tidak menggunakan sumber pelayan dan sesuai untuk senario komunikasi masa nyata berkonkurensi tinggi.

2. WebSocket

WebSocket ialah satu lagi teknologi yang membolehkan komunikasi masa nyata Ia boleh mewujudkan sambungan berterusan dua hala antara pelanggan dan pelayan untuk mencapai komunikasi masa nyata. Pada WebSocket, mesej boleh dihantar antara pelanggan dan pelayan tanpa perlu berulang kali mewujudkan dan menutup sambungan, sekali gus meningkatkan kecekapan komunikasi.

Dalam pembangunan API PHP, perpustakaan pihak ketiga boleh digunakan untuk mengendalikan WebSocket, seperti Ratchet, Swoole, dsb. Protokol WebSocket boleh dilaksanakan dengan mudah menggunakan perpustakaan ini, dan ia juga boleh menyokong pelbagai protokol dan acara tersuai, menjadikan pembangunan sangat mudah. Berikut ialah contoh kod untuk menggunakan Ratchet untuk mengendalikan WebSocket:

<?php
require __DIR__ . '/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);
    }

    public function onMessage(ConnectionInterface $conn, $msg) {
        // 收到客户端消息
        foreach ($this->clients as $client) {
            if ($conn === $client) {
                continue;
            }
            $client->send($msg); // 发送消息给其他客户端
        }
    }

    public function onClose(ConnectionInterface $conn) {
        // 客户端断开连接
        $this->clients->detach($conn);
    }

    public function onError(ConnectionInterface $conn, Exception $e) {
      // 出错时的处理
    }
}

// 启动聊天服务
$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8080
);
$server->run();
?>

Dalam kod di atas, kami menggunakan Ratchet untuk melaksanakan perkhidmatan sembang mudah Apabila pelanggan menyambung, kaedah onOpen akan dicetuskan; Apabila pelanggan menghantar mesej, kaedah onMessage dicetuskan apabila pelanggan memutuskan sambungan, kaedah onClose dicetuskan apabila ralat berlaku, kaedah onError dicetuskan. Dalam perkhidmatan ini, kami hanya menyiarkan mesej yang dihantar oleh pelanggan kepada pelanggan lain, melaksanakan ruang sembang ringkas.

Ringkasan

Dalam pembangunan API PHP, teknologi dan kaedah yang berbeza boleh digunakan untuk mengendalikan Long Polling dan WebSocket. Kaedah Long Polling adalah agak mudah Anda boleh menggunakan gelung sementara untuk menunggu ketibaan data baharu, tetapi ia akan menduduki sumber pelayan. Kaedah WebSocket agak rumit dan boleh dilaksanakan menggunakan perpustakaan pihak ketiga Ia juga boleh menyokong pelbagai protokol dan acara tersuai, menjadikannya sangat mudah untuk dibangunkan. Tidak kira kaedah yang digunakan, masalah pendudukan sumber dan prestasi pelayan perlu dipertimbangkan untuk memastikan kestabilan dan kebolehpercayaan sistem.

Atas ialah kandungan terperinci Bagaimana untuk menangani Long Polling dan WebSocket dalam pembangunan API 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