PHP实现websocket通信
PHP实现WebSocket通信的方法
WebSocket是一种在单个TCP连接上进行全双工通信的协议。PHP可以通过以下方法实现WebSocket服务端功能:
使用原生PHP socket函数
PHP提供了socket扩展,可以直接操作底层socket实现WebSocket协议:

$host = '0.0.0.0';
$port = 8080;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, $host, $port);
socket_listen($socket);
$clients = array($socket);
while (true) {
$read = $clients;
$write = $except = null;
socket_select($read, $write, $except, 0);
if (in_array($socket, $read)) {
$new_client = socket_accept($socket);
$clients[] = $new_client;
$header = socket_read($new_client, 1024);
performHandshake($header, $new_client);
}
foreach ($read as $read_socket) {
if ($read_socket == $socket) continue;
$data = socket_read($read_socket, 1024);
if ($data === false) {
socket_close($read_socket);
unset($clients[array_search($read_socket, $clients)]);
continue;
}
$unmasked = unmask($data);
echo "Received: ".$unmasked.PHP_EOL;
$response = mask("Server received: ".$unmasked);
socket_write($read_socket, $response, strlen($response));
}
}
function performHandshake($header, $client) {
// WebSocket握手处理逻辑
}
function unmask($text) {
// 数据解掩码逻辑
}
function mask($text) {
// 数据掩码逻辑
}
使用Ratchet库
Ratchet是一个流行的PHP WebSocket库,简化了WebSocket实现:

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class MyWebSocket implements MessageComponentInterface {
public function onOpen(ConnectionInterface $conn) {
echo "New connection ({$conn->resourceId})\n";
}
public function onMessage(ConnectionInterface $from, $msg) {
echo "Received message: {$msg}\n";
$from->send("Server received: ".$msg);
}
public function onClose(ConnectionInterface $conn) {
echo "Connection {$conn->resourceId} has disconnected\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "Error: {$e->getMessage()}\n";
$conn->close();
}
}
$app = new Ratchet\App('localhost', 8080);
$app->route('/chat', new MyWebSocket);
$app->run();
使用Swoole扩展
Swoole提供了高性能的WebSocket服务器实现:
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
$server->on('open', function(Swoole\WebSocket\Server $server, $request) {
echo "connection open: {$request->fd}\n";
});
$server->on('message', function(Swoole\WebSocket\Server $server, $frame) {
echo "received message: {$frame->data}\n";
$server->push($frame->fd, "Server received: {$frame->data}");
});
$server->on('close', function($server, $fd) {
echo "connection close: {$fd}\n";
});
$server->start();
客户端连接示例
HTML5 WebSocket客户端连接代码:
var ws = new WebSocket('ws://localhost:8080');
ws.onopen = function() {
ws.send('Hello Server');
};
ws.onmessage = function(e) {
console.log('Server: ' + e.data);
};
ws.onclose = function() {
console.log('Connection closed');
};
注意事项
- WebSocket需要PHP 5.3或更高版本
- 原生PHP实现需要处理握手协议和数据帧解析
- 生产环境推荐使用Ratchet或Swoole等成熟解决方案
- 需要考虑安全性,如实现WSS(WebSocket Secure)
- 对于高并发场景,Swoole性能更优
以上方法可以根据项目需求选择适合的实现方式。原生PHP实现适合学习WebSocket协议原理,而Ratchet和Swoole更适合生产环境部署。






