How websocket work on php

WebSockets allow two-way, real-time communication between the server and client over a single, persistent connection. In PHP, you can implement WebSockets using either:

  • Pure PHP (for basic or small projects)
  • Libraries like Ratchet
  • External services (like Pusher or Swoole)

How WebSocket Works (Conceptually)

  1. Client initiates a WebSocket connection to the server.
  2. Server responds and upgrades the connection from HTTP to WebSocket.
  3. Both can send and receive data in real time without reloading or polling.
  4. Connection stays open unless explicitly closed by client or server.

Simple Example Using Raw PHP

1. Create a WebSocket Server in PHP

Save as server.php

<?php
$host = 'localhost';
$port = 8080;
$socket = stream_socket_server("tcp://$host:$port", $errno, $errstr);

if (!$socket) {
    die("Error: $errstr ($errno)");
}
echo "Server running at $host:$port\n";

while ($conn = stream_socket_accept($socket, -1)) {
    $request = fread($conn, 1024);
    
    // Simple handshake
    if (preg_match('#Sec-WebSocket-Key: (.*)\r\n#', $request, $matches)) {
        $key = trim($matches[1]);
        $acceptKey = base64_encode(pack('H*', sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
        $response = "HTTP/1.1 101 Switching Protocols\r\n" .
                    "Upgrade: websocket\r\n" .
                    "Connection: Upgrade\r\n" .
                    "Sec-WebSocket-Accept: $acceptKey\r\n\r\n";
        fwrite($conn, $response);
    }

    // Now server can send and receive WebSocket data
    while (true) {
        $data = fread($conn, 1024);
        if (!$data) break;

        // Echo back the received message
        $responseData = "\x81" . chr(strlen("Received: $data")) . "Received: $data";
        fwrite($conn, $responseData);
    }

    fclose($conn);
}

2. Client Side (HTML + JS)

<!DOCTYPE html>
<html>
<head><title>WebSocket Test</title></head>
<body>
    <input type="text" id="msg">
    <button onclick="sendMsg()">Send</button>
    <div id="log"></div>

    <script>
        const ws = new WebSocket('ws://localhost:8080');

        ws.onmessage = (event) => {
            document.getElementById('log').innerHTML += `<p>${event.data}</p>`;
        };

        function sendMsg() {
            const msg = document.getElementById('msg').value;
            ws.send(msg);
        }
    </script>
</body>
</html>

Run php server.php from the terminal and open the HTML in a browser.

Better PHP WebSocket Server (Recommended for Production)

Use Ratchet, a PHP WebSocket library.

composer require cboden/ratchet
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

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

class Chat implements MessageComponentInterface {
    public function onOpen(ConnectionInterface $conn) {
        echo "New connection: {$conn->resourceId}\n";
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        echo "Message: $msg\n";
        $from->send("Server received: $msg");
    }

    public function onClose(ConnectionInterface $conn) {
        echo "Connection {$conn->resourceId} closed\n";
    }

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

$server = \Ratchet\Server\IoServer::factory(new Chat, 8080);
$server->run();

Notes

  • WebSockets run on a persistent process. Use supervisor or systemd to keep them running in production.
  • PHP scripts usually die after execution, but WebSocket servers should be long-lived.
  • You can’t use WebSockets over regular Apache/Nginx+PHP-FPM alone. You need a CLI-based script.

Leave a Reply

Your email address will not be published. Required fields are marked *