无膨胀 / php-websocket
PHP中的简单WebSocket服务器和客户端实现。
This package is not auto-updated.
Last update: 2024-09-28 20:30:35 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服务器本身处理连接,但没有附加逻辑几乎毫无用处。这种逻辑由应用程序添加。在上面的示例中,两个应用程序被添加到服务器中: status
和 chat
。
您应用程序中最重要的方法将是
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; }
onConnect
和 onDisconnect
可以用来跟踪连接到您的应用程序的所有客户端。 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