Home  >  Article  >  Backend Development  >  How to achieve real-time communication using PHP and WebSocket

How to achieve real-time communication using PHP and WebSocket

WBOY
WBOYOriginal
2023-12-17 22:24:441283browse

How to achieve real-time communication using PHP and WebSocket

With the continuous development of Internet technology, real-time communication has become an indispensable part of daily life. Efficient, low-latency real-time communication can be achieved using WebSockets technology, and PHP, as one of the most widely used development languages ​​in the Internet field, also provides corresponding WebSocket support. This article will introduce how to use PHP and WebSocket to achieve real-time communication, and provide specific code examples.

1. What is WebSocket

WebSocket is a protocol for full-duplex communication on a single TCP connection. Different from the HTTP protocol, after the WebSocket connection is established, data can be exchanged directly between the server and the client without the need to interact through HTTP requests and responses. This enables WebSocket to achieve low-latency, high-efficiency real-time communication, and is suitable for online games, chat rooms and other scenarios that require high concurrency and real-time interaction.

2. How PHP supports WebSocket

PHP provides some libraries and frameworks to implement WebSocket, such as Ratchet, Wrench, etc. These libraries and frameworks are implemented based on the PHP extension Swoole. Swoole is a high-performance network communication framework for PHP that supports asynchronous IO, coroutine and other features. It is suitable for building high-concurrency, high-performance web servers, game servers and other applications.

In this article, we will use the Ratchet library to implement WebSocket. Ratchet provides an implementation of the standards-based RFC6455 WebSocket protocol and has the characteristics of ease of use, flexibility, and high scalability. At the same time, Ratchet also supports WebSockets sub-protocols, such as STOMP, WAMP, etc., and provides complete documentation and sample code to facilitate developers to get started quickly.

3. Sample code to achieve real-time communication

Below we use a simple chat room application to demonstrate how to use PHP and WebSocket to achieve real-time communication.

  1. Install Ratchet

Install Ratchet locally or on the server side, you can install it through Composer:

composer require cboden/ratchet
  1. Write WebSocket server

Create a PHP file server.php with the following code:

<?php
require dirname(__DIR__) . '/vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
use RatchetWebSocketMessageComponentTrait;

class Chat implements MessageComponentInterface
{
    use MessageComponentTrait;

    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 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();
    }

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

$server = new RatchetWebSocketWsServer(new Chat());
$loop = ReactEventLoopFactory::create();
$socket = new ReactSocketServer('0.0.0.0:8080', $loop);
$server = new RatchetServerIoServer($server, $socket, $loop);
echo "Server started
";
$server->run();

The above code creates a simple chat room server, listening on port 8080 and waiting for client connections. When the client connects, the onOpen method is called and the client connection object is saved to an ObjectStorage object. When the client sends a message, the onMessage method is called to send the message to all clients connected to the server. When the client disconnects, the onClose method will be called to delete the client connection object from the ObjectStorage object.

  1. Writing WebSocket client

Create an HTML file client.html with the following code:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Chat Room</title>
    <style>
        #messages {
            margin-bottom: 10px;
            padding: 5px;
            border: 1px solid #ddd;
            overflow-y: scroll;
            height: 200px;
        }
    </style>
</head>
<body>
    <div>
        <input type="text" id="input-message" placeholder="Write a message...">
        <button id="btn-send">Send</button>
    </div>
    <div id="messages"></div>

    <script>
        var conn = new WebSocket('ws://localhost:8080');
        var messages = document.getElementById('messages');
        var inputMessage = document.getElementById('input-message');
        var btnSend = document.getElementById('btn-send');

        conn.onopen = function(e) {
            messages.innerHTML += '<div>Connected to server</div>'
        };

        conn.onmessage = function(e) {
            messages.innerHTML += '<div>' + e.data + '</div>'
        };

        conn.onerror = function(e) {
            console.log('An error occurred: ' + e.data);
        };

        conn.onclose = function(e) {
            messages.innerHTML += '<div>Connection closed</div>'
        };

        btnSend.onclick = function() {
            if (inputMessage.value) {
                conn.send(inputMessage.value);
                inputMessage.value = '';
            }
        };

        inputMessage.addEventListener('keydown', function(e) {
            if (e.keyCode === 13 && inputMessage.value.trim()) {
                conn.send(inputMessage.value);
                inputMessage.value = '';
            }
        });
    </script>
</body>
</html>

The above code creates a simple chat room The client establishes a connection with the server through WebSocket and listens to the server's messages. When the user enters a message in the text box and clicks the send button or presses the enter key, the message is sent to the server and displayed in the chat window.

  1. Run the WebSocket server and client

Start the WebSocket server in the terminal:

php server.php

Open the client page client.html in the web browser , enter your message and send, you will see the message is sent to the server and other clients connected to the server will receive the same message. In this way, we successfully implemented real-time communication using PHP and WebSocket.

4. Summary

As an efficient and low-latency real-time communication protocol, WebSocket provides us with a new way of real-time interaction. At the same time, PHP provides a wealth of WebSocket support libraries and frameworks, allowing us to easily build efficient, fast, and stable WebSocket applications. I hope this article can help you better understand and use WebSocket technology and implement more real-time communication applications.

The above is the detailed content of How to achieve real-time communication using PHP and WebSocket. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn