无膨胀/php-websocket

PHP中的简单WebSocket服务器和客户端实现。

v3.0.3 2022-08-20 08:39 UTC

README

Bloatless PHP WebSockets

PHP实现的简单WebSocket服务器。

安装

需求

  • PHP >= 7.4
  • ext-json
  • ext-sockets

安装过程

使用composer安装包

composer require bloatless/php-websocket

用法

服务器

将源代码下载到您的计算机后,您需要一些代码来实际构建您的WebSocket服务器。以下是一个基本示例

<?php

// require necessary files here

// create new server instance
$server = new \Bloatless\WebSocket\Server('127.0.0.1', 8000, '/tmp/phpwss.sock');

// server settings
$server->setMaxClients(100);
$server->setCheckOrigin(false);
$server->setAllowedOrigin('example.com');
$server->setMaxConnectionsPerIp(20);

// add your applications
$server->registerApplication('status', \Bloatless\WebSocket\Application\StatusApplication::getInstance());
$server->registerApplication('chat', \Bloatless\WebSocket\Examples\Application\Chat::getInstance());

// start the server
$server->run();

假设此代码在一个名为 server.php 的文件中,您可以使用以下命令启动您的服务器

php server.php

然后,WebSocket服务器将在提供的宿主和端口上监听新的连接。默认情况下,这将是在 localhost:8000

此存储库还包括在 examples/server.php 中的有效示例

应用程序

WebSocket服务器本身处理连接,但没有附加逻辑几乎毫无用处。这种逻辑由应用程序添加。在上面的示例中,两个应用程序被添加到服务器中: statuschat

您应用程序中最重要的方法将是

interface ApplicationInterface
{
    public function onConnect(Connection $connection): void;

    public function onDisconnect(Connection $connection): void;

    public function onData(string $data, Connection $client): void;

    public function onIPCData(array $data): void;
}

onConnectonDisconnect 可以用来跟踪连接到您的应用程序的所有客户端。 onData 将在WebSocket服务器从连接到应用程序的客户端接收新数据时被调用。 onIPCData 如果您的机器上的另一个进程提供数据,则会被调用。(见 推送客户端(IPC)

应用程序的有效示例可以在 examples/Application/Chat.php 中找到

定时器

对于像WebSocket服务器这样的长时间运行的过程,通常需要定期执行任务。这可以通过定时器来完成。定时器可以定期执行服务器或应用程序中的方法。以下是一个示例

$server = new \Bloatless\WebSocket\Server('127.0.0.1', 8000, '/tmp/phpwss.sock');
$chat = \Bloatless\WebSocket\Examples\Application\Chat::getInstance();
$server->addTimer(5000, function () use ($chat) {
    $chat->someMethod();
});
$server->registerApplication('chat', $chat);

此示例将每5秒调用您聊天应用程序中的 someMethod 方法。

推送客户端(IPC)

通常需要将数据从另一个应用程序推送到WebSocket服务器进程。假设您运行一个包含聊天和一个包含新闻或博客的区域。现在每当您的博客中发布一篇新文章时,您都希望通知所有当前在聊天中的用户。为了实现这一点,您需要以某种方式将您的博客逻辑中的数据推送到WebSocket服务器。这就是推送客户端发挥作用的地方。

在启动WebSocket服务器时,它将打开一个Unix域套接字并监听新消息。然后可以使用推送客户端发送这些消息。以下是一个示例

$pushClient = new \Bloatless\WebSocket\PushClient('//tmp/phpwss.sock');
$pushClient->sendToApplication('chat', [
    'action' => 'echo',
    'data' => 'New blog post was published!',
]);

此代码将数据推送到正在运行的WebSocket服务器进程。在这种情况下,聊天应用程序中的 echo 方法被调用,并将提供的信息发送给所有已连接的客户端。

您可以在 examples/push.php 中找到完整的工作示例

重要提示:推送消息不能超过64kb!

客户端(浏览器/JS)

上面的所有内容都与服务器端相关。但是,如何从您的浏览器连接到服务器呢?

这是一个简单的示例

<script>
 // connect to chat application on server
let serverUrl = 'ws://127.0.0.1:8000/chat';
let socket = new WebSocket(serverUrl);

// log new messages to console
socket.onmessage = (msg) => {
    let response = JSON.parse(msg.data);
    console.log(response.data);
};
</script>

此javascript连接到您的服务器上的聊天应用,并将所有收到的消息打印到控制台。

更好的聊天客户端示例可以在以下位置找到: examples/public/chat.html

预期用途和限制

此项目主要是为了教育目的而构建的。代码相对简单且易于理解。此服务器未在生产环境中进行测试,因此我强烈建议不要将其用于实际项目。它完全适合小型教育项目或内部工具,但可能无法很好地处理大量流量或连接。

此外,一些“功能”是故意缺失的

  • 不支持SSL。如果需要,可以使用nginx等反向代理。
  • 不支持二进制消息。
  • 还有很多其他的事情我甚至都没有意识到 ;)

如果您需要更“健壮”的PHP编写的WebSocket服务器,请查看以下列出的优秀替代方案。

替代方案

许可证

MIT