php实现websoc
PHP 实现 WebSocket
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于实时应用。PHP 可以通过以下几种方式实现 WebSocket 功能。
使用 ratchet/pawl 库
Ratchet 是一个 PHP WebSocket 库,可以轻松实现 WebSocket 服务器和客户端。
安装 Ratchet:
composer require ratchet/pawl
创建 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();
创建 WebSocket 客户端:
use Ratchet\Client\Connector;
use React\EventLoop\Factory;
$loop = Factory::create();
$connector = new Connector($loop);
$connector('ws://localhost:8080')
->then(function(Ratchet\Client\WebSocket $conn) {
$conn->on('message', function($msg) use ($conn) {
echo "Received: {$msg}\n";
});
$conn->send('Hello Server!');
}, function(\Exception $e) use ($loop) {
echo "Could not connect: {$e->getMessage()}\n";
$loop->stop();
});
$loop->run();
使用 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) {
echo "Received message: {$frame->data}\n";
$server->push($frame->fd, "Server: {$frame->data}");
});
$server->on('close', function($server, $fd) {
echo "Connection close: {$fd}\n";
});
$server->start();
使用原生 PHP 和 socket 扩展
虽然复杂,但可以通过 PHP 的 socket 扩展实现 WebSocket。
创建 WebSocket 握手和处理:

$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));
}
while (true) {
$data = socket_read($client, 1024);
if ($data === false) break;
// 处理 WebSocket 数据帧
}
socket_close($client);
}
注意事项
- 使用第三方库(如 Ratchet 或 Swoole)可以简化实现。
- 原生实现需要处理 WebSocket 协议细节,如握手、数据帧解析等。
- 生产环境推荐使用 Swoole 或 Ratchet 以获得更好的性能和稳定性。
以上方法可以根据项目需求选择适合的实现方式。






