php实现websoc
PHP 实现 WebSocket
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,允许服务器和客户端之间实时交互。PHP 可以通过以下方式实现 WebSocket 功能。
使用 Ratchet 库
Ratchet 是一个流行的 PHP 库,用于实现 WebSocket 服务器。以下是实现步骤:
安装 Ratchet:
composer require cboden/ratchet
创建 WebSocket 服务器:
<?php
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 处理类:
<?php
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);
echo "New connection: {$conn->resourceId}\n";
}
public function onMessage(ConnectionInterface $from, $msg) {
foreach ($this->clients as $client) {
if ($client !== $from) {
$client->send($msg);
}
}
}
public function onClose(ConnectionInterface $conn) {
$this->clients->detach($conn);
echo "Connection closed: {$conn->resourceId}\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "Error: {$e->getMessage()}\n";
$conn->close();
}
}
启动服务器:
php server.php
使用 Swoole 扩展
Swoole 是一个高性能的 PHP 协程框架,支持 WebSocket 服务器。
安装 Swoole:
pecl install swoole
创建 WebSocket 服务器:
<?php
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
$server->on('open', function (Swoole\WebSocket\Server $server, $request) {
echo "New connection: {$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 closed: {$fd}\n";
});
$server->start();
启动服务器:
php server.php
使用原生 PHP 实现
虽然不推荐,但可以通过原生 PHP 实现简单的 WebSocket 服务器。
创建服务器脚本:
<?php
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
die("Failed to create socket: $errstr ($errno)\n");
}
while ($conn = stream_socket_accept($socket)) {
$data = fread($conn, 1024);
fwrite($conn, "HTTP/1.1 101 Switching Protocols\r\n");
fwrite($conn, "Upgrade: websocket\r\n");
fwrite($conn, "Connection: Upgrade\r\n");
fwrite($conn, "Sec-WebSocket-Accept: " . base64_encode(sha1($data . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true)) . "\r\n\r\n");
while ($msg = fread($conn, 1024)) {
echo "Received: $msg\n";
fwrite($conn, "Server: $msg");
}
fclose($conn);
}
fclose($socket);
启动服务器:
php server.php
客户端连接
使用 JavaScript 连接 WebSocket 服务器:
const socket = new WebSocket('ws://localhost:8080');
socket.onopen = function(e) {
console.log('Connection established');
socket.send('Hello Server!');
};
socket.onmessage = function(event) {
console.log(`Message from server: ${event.data}`);
};
socket.onclose = function(event) {
console.log('Connection closed');
};
socket.onerror = function(error) {
console.log(`Error: ${error.message}`);
};
注意事项
- 确保服务器端口未被防火墙阻止。
- 使用
Ratchet或Swoole时,确保 PHP 版本兼容。 - 原生实现仅适用于简单场景,生产环境推荐使用成熟的库或扩展。







