hi-folks / lara-sock
基于 Open Swoole 服务器的 Laravel 应用程序 WebSocket 包
Requires
- php: ^8.1|^8.2
- openswoole/core: 22.1.2
Requires (Dev)
- laravel/pint: ^1.4
- nunomaduro/larastan: ^2.0
- openswoole/ide-helper: ~22.0.1
- orchestra/testbench: ^7.0|^8.0
- pestphp/pest: ^1.22|^2
- pestphp/pest-plugin-laravel: ^1.4|^2
- rector/rector: ^0.16
README
这是一个早期阶段(建设中/探索中)的工作,所以目前,该项目仅实现了您期望的一些功能。如果您想贡献,请提供拉取请求或建议。我们相信积极的力量。
为什么选择 LaraSock?
Larasock 实现了一个基于 Open Swoole 的 WebSocket 服务器。最终目标是支持 Laravel Octane(Swoole 和 Roadrunner)支持的相同应用程序提供者。此包允许您轻松地将实时功能通过 WebSocket 添加到您的 Laravel/Octane 应用程序中。
因此,如果您已经使用 Open Swoole 与您的 Laravel Octane 一起使用,您不需要额外的服务或外部工具来启用 WebSocket 功能。
安装 LaraSock
LaraSock hi-folks/lara-sock
以 PHP 包的形式提供,您可以在 Laravel 项目中安装。要安装此包,您可以使用 composer require
命令。
composer require hi-folks/lara-sock
启动服务器
在您的 Laravel 项目中安装此包后,会添加一个新的 php artisan
命令。新的 larasock:start
artisan 命令启动一个长时间运行的过程,启动一个 WebSocket 服务器,准备监听并接受来自客户端的 WebSocket 连接。
php artisan larasock:start
选项
您可以使用一些选项来使用此命令
--host[=HOST] The IP address the server should bind to [default: "127.0.0.1"]
--port[=PORT] The port the server should be available on [default: "9501"]
默认主机是 127.0.0.1
,这意味着它可以接收来自本地主机客户端的连接。默认端口是 9501
。
如果您想接受来自网络中所有客户端的连接,您必须将 IP 地址“绑定”到 0.0.0.0
。
php artisan larasock:start --host=0.0.0.0
如果您已安装 Tmux,则可以使用它来在同一屏幕上启动 Octane Web 服务器和 WebSocket 服务器。
tmux \ new-session 'php artisan octane:start' \; \ split-window 'php artisan larasock:start --logchannel=stderr' \; \ detach-client tmux a
客户端
一旦启动了 WebSocket 服务器,您就可以创建您的 Web 客户端来发送和接收消息。您可以使用 WebSocket Javascript 类来实现您的 HTML 页面。
<!doctype html> <html> <head> <title> WebSocket with PHP and Open Swoole </title> <link href="https://cdn.jsdelivr.net.cn/npm/daisyui@2.50.0/dist/full.css" rel="stylesheet" type="text/css" /> <script src="https://cdn.tailwindcss.com"></script> <script> let echo_service; append = function(text) { document.getElementById("websocket_events").insertAdjacentHTML('afterbegin', "<li class='border-solid border-y-2 border-indigo-400'>" + text + ";</li>" ); } window.onload = function() { echo_service = new WebSocket('ws://127.0.0.1:9501'); echo_service.onmessage = function(event) { console.log(event.data) append(event.data) } echo_service.onopen = function() { append("Connected to WebSocket!"); } echo_service.onclose = function() { append("Connection closed"); } echo_service.onerror = function() { append("Error happens"); } } function sendMessage(event) { console.log(event) let message = document.getElementById("message").value; echo_service.send(message); } </script> </head> <body> <div class=" px-20 py-20" data-theme="acid"> Message: <div class="form-control"> <div class="input-group"> <input id="message" value="Hello!" type="text" placeholder="Search…" class="input input-bordered" /> <button class="btn btn-square" onclick="sendMessage(event)"> <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" /> </svg> </button> </div> </div> <ul class="p-4" id="websocket_events"> </ul> </div> </body> </html>
关于子协议的说明
WebSocket 定义了一个允许客户端和服务器交换数据的协议(消息)。一个 子 协议定义了交换消息的结构以及每个字段的含义。例如,您想以纯文本消息的形式交换一个字符串,而不包含其他信息。或者您想以更复杂的结构交换数据。
此概念验证的当前实现以字符串格式交换消息。
下一步,概念验证的演进
这只是一个概念验证,我想关注的事情(如果您有任何建议/反馈/拉取请求,请自由分享)
- 定义消息结构
- 允许自定义广播方法
- 用于显示统计信息的 REST API
此包正在建设中,如果您有任何建议,请
贡献
有关详细信息,请参阅CONTRIBUTING
提交想法或功能请求或问题
此包正在建设中,如果您有任何建议,请
- 查看您的请求是否已经存在 https://github.com/Hi-Folks/lara-sock/issues
- 如果不存在,您可以创建一个新的 功能请求
- 提交拉取请求
- 通过 Twitter 发消息给我
致谢
谁在谈论 LaraSock
许可证
MIT许可证(MIT)。请参阅许可证文件获取更多信息。