php 实现ws
PHP 实现 WebSocket 服务
WebSocket 是一种全双工通信协议,允许客户端和服务器之间进行实时数据交换。PHP 可以通过以下方式实现 WebSocket 服务。
使用 Ratchet 库
Ratchet 是一个流行的 PHP WebSocket 库,基于 ReactPHP 实现。
安装 Ratchet:
composer require cboden/ratchet
创建 WebSocket 服务器:
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
8080
);
$server->run();
实现 Chat 类处理消息:

namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class Chat implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
$this->clients->attach($conn);
}
public function onMessage(ConnectionInterface $from, $msg) {
foreach ($this->clients as $client) {
if ($from !== $client) {
$client->send($msg);
}
}
}
public function onClose(ConnectionInterface $conn) {
$this->clients->detach($conn);
}
public function onError(ConnectionInterface $conn, \Exception $e) {
$conn->close();
}
}
使用 Swoole 扩展
Swoole 是 PHP 的高性能网络通信引擎,内置 WebSocket 支持。
安装 Swoole:
pecl install 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) {
foreach ($server->connections as $fd) {
if ($fd !== $frame->fd) {
$server->push($fd, $frame->data);
}
}
});
$server->on('close', function($server, $fd) {
echo "connection close: {$fd}\n";
});
$server->start();
原生 PHP 实现
PHP 也可以使用原生 socket 函数实现 WebSocket,但需要手动处理握手协议。
创建 socket 服务器:
$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);
$headers = socket_read($client, 1024);
if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $headers, $match)) {
$key = base64_encode(sha1($match[1] . '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: $key\r\n\r\n";
socket_write($client, $response, strlen($response));
}
// 消息处理逻辑...
}
客户端连接示例
HTML/JavaScript 客户端连接代码:
<script>
const socket = new WebSocket('ws://localhost:8080');
socket.onopen = function(e) {
console.log('Connection established');
};
socket.onmessage = function(event) {
console.log('Data received: ' + event.data);
};
socket.onclose = function(event) {
console.log('Connection closed');
};
</script>
注意事项
- Ratchet 适合中小型应用,安装简单但性能有限
- Swoole 性能优异,适合高并发场景,但需要安装扩展
- 原生实现灵活性高,但开发复杂度大,需要处理协议细节
- 生产环境建议使用 Nginx 反向代理 WebSocket 连接
- 注意实现心跳机制保持连接活跃
- 考虑添加 SSL/TLS 支持(wss://)增强安全性
以上方法提供了不同复杂度和性能级别的 PHP WebSocket 实现方案,可根据项目需求选择合适的实现方式。






