web socket实现php
WebSocket 实现 PHP
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于实时应用如聊天、游戏或实时数据更新。在 PHP 中实现 WebSocket 通常需要结合后端服务器和前端 JavaScript。
使用 Ratchet 库实现 WebSocket
Ratchet 是一个流行的 PHP WebSocket 库,基于 ReactPHP 实现。
安装 Ratchet 通过 Composer 安装 Ratchet:
composer require cboden/ratchet
创建 WebSocket 服务器
创建一个 PHP 文件(如 server.php)并编写以下代码:
<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
class Chat implements \Ratchet\MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(\Ratchet\ConnectionInterface $conn) {
$this->clients->attach($conn);
echo "New connection: {$conn->resourceId}\n";
}
public function onMessage(\Ratchet\ConnectionInterface $from, $msg) {
foreach ($this->clients as $client) {
if ($from !== $client) {
$client->send($msg);
}
}
}
public function onClose(\Ratchet\ConnectionInterface $conn) {
$this->clients->detach($conn);
echo "Connection closed: {$conn->resourceId}\n";
}
public function onError(\Ratchet\ConnectionInterface $conn, \Exception $e) {
echo "Error: {$e->getMessage()}\n";
$conn->close();
}
}
$server = IoServer::factory(
new HttpServer(new WsServer(new Chat())),
8080
);
$server->run();
运行服务器 在终端执行:
php server.php
前端连接 WebSocket
在前端 JavaScript 中连接 WebSocket 服务器:
<script>
const socket = new WebSocket('ws://localhost:8080');
socket.onopen = function(e) {
console.log('Connected to WebSocket server');
};
socket.onmessage = function(e) {
console.log('Message from server:', e.data);
};
socket.onclose = function(e) {
console.log('Connection closed');
};
// 发送消息
function sendMessage() {
const message = document.getElementById('message').value;
socket.send(message);
}
</script>
使用 PHP 原生 Socket 实现
对于更底层的实现,可以使用 PHP 的 socket 扩展。
创建 Socket 服务器
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
while (true) {
$client = socket_accept($socket);
$data = socket_read($client, 1024);
// 处理 WebSocket 握手
if (strpos($data, 'Upgrade: websocket') !== false) {
$headers = explode("\r\n", $data);
$key = '';
foreach ($headers as $header) {
if (strpos($header, 'Sec-WebSocket-Key') !== false) {
$key = trim(substr($header, 19));
break;
}
}
$accept = base64_encode(sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
$response = "HTTP/1.1 101 Switching Protocols\r\n";
$response .= "Upgrade: websocket\r\n";
$response .= "Connection: Upgrade\r\n";
$response .= "Sec-WebSocket-Accept: $accept\r\n\r\n";
socket_write($client, $response, strlen($response));
}
// 处理消息(需解析 WebSocket 帧)
// ...
}
注意事项
- 性能问题:PHP 是单线程的,原生实现可能不适合高并发场景。推荐使用 Ratchet 或 Swoole(高性能 PHP 协程框架)。
- 安全性:确保实现 WebSocket 握手和帧解析的正确性,避免安全漏洞。
- 生产环境:考虑使用 Nginx 或 Apache 反向代理 WebSocket 连接。
通过以上方法,可以在 PHP 中实现 WebSocket 功能,适用于实时通信需求。







