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)
- Client initiates a WebSocket connection to the server.
- Server responds and upgrades the connection from HTTP to WebSocket.
- Both can send and receive data in real time without reloading or polling.
- 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