WebSocket是一种在单个TCP连接上进行全双工通讯的协议,使得客户端和服务器之间的交互更加快速、实时,在PHP中实现WebSocket,我们可以使用PHP的Swoole、Workerman等扩展,也可以使用Ratchet这样的PHP库,下面我将详细介绍如何使用Swoole和Ratchet来实现WebSocket。
使用Swoole实现WebSocket
1、安装Swoole扩展
需要在服务器上安装Swoole扩展,可以通过以下命令进行安装:
pecl install swoole
安装完成后,修改php.ini文件,添加以下配置:
extension=swoole.so
重启PHP-FPM或Apache使配置生效。
2、创建WebSocket服务器
我们创建一个WebSocket服务器,新建一个文件websocket_server.php,写入以下代码:
<?php
// 创建WebSocket服务器
$server = new SwooleWebSocketServer("0.0.0.0", 9501);
// 监听WebSocket连接打开事件
$server->on('open', function (SwooleWebSocketServer $server, $request) {
echo "连接打开:{$request->fd}
";
});
// 监听WebSocket消息事件
$server->on('message', function (SwooleWebSocketServer $server, $frame) {
echo "收到来自 {$frame->fd} 的消息:{$frame->data}
";
// 向客户端发送消息
$server->push($frame->fd, "服务器收到了你的消息:{$frame->data}");
});
// 监听WebSocket连接关闭事件
$server->on('close', function ($ser, $fd) {
echo "连接关闭:{$fd}
";
});
// 启动服务器
$server->start();
?>3、运行服务器
在命令行中运行以下命令,启动WebSocket服务器:
php websocket_server.php
4、创建客户端
创建一个HTML文件websocket_client.html,用于与WebSocket服务器通信,写入以下代码:
<!DOCTYPE html>
<html>
<head>
<title>WebSocket客户端</title>
</head>
<body>
<div id="message"></div>
<input type="text" id="text">
<button onclick="send()">发送</button>
<script>
var ws = new WebSocket("ws://127.0.0.1:9501");
ws.onopen = function() {
console.log("连接成功");
};
ws.onmessage = function(e) {
document.getElementById("message").innerHTML += "<p>" + e.data + "</p>";
};
function send() {
var text = document.getElementById("text").value;
ws.send(text);
document.getElementById("text").value = '';
}
</script>
</body>
</html>5、测试
打开websocket_client.html文件,在浏览器中查看效果,输入文本,点击“发送”按钮,即可与服务器进行实时通信。
使用Ratchet实现WebSocket
1、安装Ratchet库
需要安装Ratchet库,在项目根目录下,运行以下命令:
composer require cboden/ratchet
2、创建WebSocket服务器
新建一个文件websocket_server.php,写入以下代码:
<?php
require __DIR__ . '/vendor/autoload.php';
use RatchetServerIoServer;
use RatchetHttpHttpServer;
use RatchetWebSocketWsServer;
use MyAppChat;
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
8080
);
$server->run();
?>3、创建Chat类
创建一个Chat类,用于处理WebSocket连接、消息和关闭事件,新建一个文件Chat.php,写入以下代码:
<?php
namespace MyApp;
use RatchetConnectionInterface;
use RatchetWebSocketWsServerInterface;
use RatchetWebSocketWsServer;
class Chat implements WsServerInterface {
protected $clients;
public function __construct() {
$this->clients = new SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
$this->clients->attach($conn);
echo "New connection! ({$conn->resourceId})
";
}
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);
echo "Connection {$conn->resourceId} has disconnected
";
}
public function onError(ConnectionInterface $conn, Exception $e) {
echo "An error has occurred: {$e->getMessage()}
";
$conn->close();
}
}
?>4、运行服务器
在命令行中运行以下命令,启动WebSocket服务器:
php websocket_server.php
5、创建客户端
创建一个HTML文件websocket_client.html,用于与WebSocket服务器通信,写入以下代码:
<!DOCTYPE html>
<html>
<head>
<title>WebSocket客户端</title>
</head>
<body>
<div id="message"></div>
<input type="text" id="text">
<button onclick="send()">发送</button>
<script>
var ws = new WebSocket("ws://127.0.0.1:8080");
ws.onopen = function() {
console.log("连接成功");
};
ws.onmessage = function(e) {
document.getElementById("message").innerHTML += "<p>" + e.data + "</p>";
};
function send() {
var text = document.getElementById("text").value;
ws.send(text);
document.getElementById("text").value = '';
}
</script>
</body>
</html>6、测试
打开websocket_client.html文件,在浏览器中查看效果,输入文本,点击“发送”按钮,即可与服务器进行实时通信。
通过以上两种方法,你可以在PHP中实现WebSocket通信,根据实际需求选择合适的方法,为你的项目添加实时性功能。

