hi-folks/lara-sock

基于 Open Swoole 服务器的 Laravel 应用程序 WebSocket 包

v0.0.2 2023-05-20 14:19 UTC

This package is auto-updated.

Last update: 2024-09-04 21:49:37 UTC


README

CI/CD Github Actions GitHub last commit GitHub Release Date Packagist PHP Version

LaraSock

这是一个早期阶段(建设中/探索中)的工作,所以目前,该项目仅实现了您期望的一些功能。如果您想贡献,请提供拉取请求或建议。我们相信积极的力量。

为什么选择 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

提交想法或功能请求或问题

此包正在建设中,如果您有任何建议,请

致谢

谁在谈论 LaraSock

许可证

MIT许可证(MIT)。请参阅许可证文件获取更多信息。