Heim  >  Artikel  >  Backend-Entwicklung  >  Umgang mit Long Polling und WebSocket in der PHP-API-Entwicklung

Umgang mit Long Polling und WebSocket in der PHP-API-Entwicklung

PHPz
PHPzOriginal
2023-06-17 08:52:141282Durchsuche

Mit der Entwicklung des Internets und des mobilen Internets müssen immer mehr Anwendungen Echtzeit-Kommunikationsfunktionen implementieren. In der Webentwicklung sind Long Polling und WebSocket zwei häufig verwendete Protokolle, die Echtzeit-Kommunikationsfunktionen implementieren können. Bei der PHP-API-Entwicklung ist der Umgang mit Long Polling und WebSocket ein Thema, das berücksichtigt werden muss.

1. Long Polling

Long Polling (Long Polling) ist eine Technologie, die Echtzeitkommunikation ermöglicht. Sein Grundprinzip besteht darin, dass der Client eine Anfrage an den Server sendet und der Server nicht sofort auf die Anfrage antwortet. Stattdessen hält er die Verbindung offen und wartet auf neue Daten, bevor er sie an den Client zurücksendet nach Erhalt der Daten.

Bei der PHP-API-Entwicklung ähnelt die Methode zur Verarbeitung von Long Polling der Verarbeitung normaler Anfragen, mit der Ausnahme, dass Sie die Verbindung offen halten und auf die Rückgabe von Daten warten müssen. Hier ist ein Beispielcode:

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

Im obigen Code verwenden wir eine While-Schleife, um die Verbindung offen zu halten, auf die Rückgabe neuer Daten an den Client zu warten und eine Weile zu warten, um erneut abzufragen, ob neue Daten vorhanden sind. Diese Methode eignet sich nicht für Szenarien mit hoher Parallelität, da jede Verbindung einen Prozess belegt. Wenn viele Clients gleichzeitig lange Abfragen durchführen, ist der Server schnell erschöpft.

Um dieses Problem zu lösen, können wir Ereignis-Listener oder Nachrichtenwarteschlangen verwenden, um Long Polling-Anfragen zu verarbeiten. Wenn neue Daten vorhanden sind, lösen Sie einen Ereignis-Listener aus oder verschieben Sie ihn in die Nachrichtenwarteschlange und verwenden Sie dann eine lange Abfrageverbindung, um die Daten abzurufen. Dies kann die Belastung des Servers reduzieren und die Stabilität des Systems verbessern. Das Folgende ist ein Beispielcode für die Verwendung von Redis zur Verarbeitung langer Polling-Anfragen:

<?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;
    }
}
?>

Im obigen Code verwenden wir die subscribe-Methode von Redis, um den Push neuer Daten zu überwachen, diese an den Client zurückzugeben und die Verbindung beenden. Diese Methode belegt keine Serverressourcen und eignet sich für Echtzeitkommunikationsszenarien mit hoher Parallelität.

2. WebSocket

WebSocket ist eine weitere Technologie, die eine Echtzeitkommunikation ermöglicht. Es kann eine bidirektionale dauerhafte Verbindung zwischen dem Client und dem Server herstellen, um eine Echtzeitkommunikation zu erreichen. Auf WebSocket können Nachrichten zwischen Clients und Servern gesendet werden, ohne dass wiederholt Verbindungen hergestellt und geschlossen werden müssen, wodurch die Kommunikationseffizienz erheblich verbessert wird.

Bei der PHP-API-Entwicklung können Bibliotheken von Drittanbietern zur Verarbeitung von WebSocket verwendet werden, z. B. Ratchet, Swoole usw. Mit diesen Bibliotheken kann das WebSocket-Protokoll einfach implementiert werden und es kann auch eine Vielzahl benutzerdefinierter Protokolle und Ereignisse unterstützen, was die Entwicklung sehr komfortabel macht. Das Folgende ist ein Beispielcode für die Verwendung von Ratchet zur Verarbeitung von 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();
?>

Im obigen Code verwenden wir Ratchet, um einen einfachen Chat-Dienst zu implementieren. Wenn ein Client eine Verbindung herstellt, wird die onOpen-Methode ausgelöst. Die onMessage-Methode wird ausgelöst. Wenn ein Client die Verbindung trennt, wird die onClose-Methode ausgelöst. Wenn ein Fehler auftritt, wird die onError-Methode ausgelöst. Bei diesem Dienst übertragen wir einfach die vom Kunden gesendeten Nachrichten an andere Kunden und implementieren so einen einfachen Chatroom.

Zusammenfassung

Bei der PHP-API-Entwicklung können verschiedene Technologien und Methoden zur Handhabung von Long Polling und WebSocket verwendet werden. Die Long Polling-Methode ist relativ einfach. Sie können eine While-Schleife verwenden, um auf das Eintreffen neuer Daten zu warten, diese beansprucht jedoch Serverressourcen. Die WebSocket-Methode ist relativ komplex und kann mithilfe von Bibliotheken von Drittanbietern implementiert werden. Sie kann auch eine Vielzahl benutzerdefinierter Protokolle und Ereignisse unterstützen, was die Entwicklung sehr erleichtert. Unabhängig davon, welche Methode verwendet wird, müssen die Ressourcenbelegung und Leistungsprobleme des Servers berücksichtigt werden, um die Stabilität und Zuverlässigkeit des Systems sicherzustellen.

Das obige ist der detaillierte Inhalt vonUmgang mit Long Polling und WebSocket in der PHP-API-Entwicklung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn