php websocket实现推送
PHP WebSocket 实现推送的方法
使用 Ratchet 库实现 WebSocket 服务
Ratchet 是一个流行的 PHP WebSocket 库,可以轻松实现实时通信功能。安装 Ratchet 可以通过 Composer 完成:
composer require cboden/ratchet
创建一个简单的 WebSocket 服务器:
<?php
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
class MyWebSocket 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 ($client !== $from) {
$client->send($msg);
}
}
}
public function onClose(ConnectionInterface $conn) {
$this->clients->detach($conn);
}
public function onError(ConnectionInterface $conn, \Exception $e) {
$conn->close();
}
}
$server = IoServer::factory(
new HttpServer(
new WsServer(
new MyWebSocket()
)
),
8080
);
$server->run();
客户端连接 WebSocket
在 HTML 页面中使用 JavaScript 连接 WebSocket 服务器:
<script>
const socket = new WebSocket('ws://localhost:8080');
socket.onopen = function(e) {
console.log('WebSocket 连接已建立');
};
socket.onmessage = function(event) {
console.log('收到消息: ' + event.data);
};
socket.onclose = function(event) {
console.log('WebSocket 连接已关闭');
};
function sendMessage() {
const message = document.getElementById('message').value;
socket.send(message);
}
</script>
<input type="text" id="message" placeholder="输入消息">
<button onclick="sendMessage()">发送</button>
使用 Swoole 实现高性能 WebSocket
Swoole 是一个高性能 PHP 协程框架,适合构建高并发的 WebSocket 服务。安装 Swoole:
pecl install swoole
创建 Swoole WebSocket 服务器:
<?php
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
$server->on('open', function (Swoole\WebSocket\Server $server, $request) {
echo "新连接: fd{$request->fd}\n";
});
$server->on('message', function (Swoole\WebSocket\Server $server, $frame) {
echo "收到消息: {$frame->data}\n";
foreach ($server->connections as $fd) {
if ($fd !== $frame->fd) {
$server->push($fd, $frame->data);
}
}
});
$server->on('close', function ($server, $fd) {
echo "连接关闭: fd{$fd}\n";
});
$server->start();
使用 Workerman 实现 WebSocket
Workerman 是另一个高性能 PHP Socket 框架。安装 Workerman:
composer require workerman/workerman
创建 Workerman WebSocket 服务器:
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
$ws_worker = new Worker("websocket://0.0.0.0:2346");
$ws_worker->count = 4;
$ws_worker->onConnect = function($connection) {
echo "新连接\n";
};
$ws_worker->onMessage = function($connection, $data) use ($ws_worker) {
foreach($ws_worker->connections as $client) {
if($client !== $connection) {
$client->send($data);
}
}
};
$ws_worker->onClose = function($connection) {
echo "连接关闭\n";
};
Worker::runAll();
Nginx 反向代理 WebSocket
在生产环境中,通常需要通过 Nginx 反向代理 WebSocket 连接:
server {
listen 80;
server_name example.com;
location /ws {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
安全考虑
实现 WebSocket 推送时需要考虑以下安全措施:

- 使用 WSS (WebSocket Secure) 协议替代 WS
- 实现身份验证机制
- 限制消息大小防止 DOS 攻击
- 对输入数据进行严格过滤
以上方法提供了多种 PHP 实现 WebSocket 推送的方案,可以根据项目需求选择合适的框架和技术栈。






