Laravel 有WebSocket客户端的组件吗?

1. 运行环境

1). 当前使用的 Laravel 版本?

laravel 10.10.1

2). 当前使用的 php版本?

PHP 版本:
PHP 8.2.3

3). 当前系统

Windows 10 如果组件需要可使用Liunx

4). 业务环境

开发环境

2. 问题描述?

需求: 场景为与C语言交互数据,C语言要求使用WebSocket作为数据传输工具,C语言那边为WebSocket服务端,php这边使用的laravel框架开发WebSocket客户端,C语言工程师要求我的客户端一直是活跃的,以便他那边主动给我发数据,需要注意的是,服务端可能会发送分包数据(1M以内)
目前搜到了textalk/websocket组件,因为个人技术局限,使用此扩展仍未解决两个问题.
1.WebSocket客户端不是活跃的.
2.WebSocket服务端发送的分包数据没有整合成一条数据接收到,数据接收不完整.

3. 您期望得到的结果?

1.Laravel框架中使用WebSocket客户端,有什么组件可以使用
2.如何保持WebSocket客户端的活跃状态
3.webSocket客户端,接收比较大的数据(低于1M)有什么好建议

因为个人技术局限,您可以从各个方面来发表你的建议,谢谢

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

用workerman,这个非常成熟了,比较稳定,你单独用可以,内嵌入laravel也行

10个月前 评论
讨论数量: 14

用workerman,这个非常成熟了,比较稳定,你单独用可以,内嵌入laravel也行

10个月前 评论

laravel-echo-server

10个月前 评论

workerman + 1,用下来感觉比soketi舒服,连广播都不用了 :smile:

10个月前 评论

单独搭一个 gateway

10个月前 评论

1、可以看下workerman,https://www.workerman.net/doc/workerman/faq/as-wss-client.html;

2、最笨的办法是开个定时器轮询;

3、切片、压缩;

10个月前 评论
你是我的眼 (楼主) 10个月前
Junwind

建议workerman的gateway,swoole没有workerman齐活。

10个月前 评论
你是我的眼 (楼主) 10个月前
梦想星辰大海

你安装了Octane吗

10个月前 评论
梦想星辰大海

下面的代码实现了心跳机制

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use WebSocket\Client;
use WebSocket\TimeoutException;

class WebsocketCommand extends Command
{
    //发起心跳字符串
    const PING_MESSAGE = "~3yPvmnz~";
    //响应心跳的字符串
    const PONG_MESSAGE = "~u38NvZ~";
    /**
     * 是否运行
     * @var bool
     */
    protected bool $running = true;

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'app:websocket';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        echo 'kill -9 ' . getmypid() . PHP_EOL;
        echo 'kill -15 ' . getmypid() . PHP_EOL;
        $this->setAsyncSignals();
        $this->listenStopSignal();
        $client = new Client("ws://192.168.1.4:6060/netsvr", ['timeout' => 1]);
        $this->keepHeartbeat(1, $client);
        while ($this->running) {
            try {
                $message = $client->receive();
                if ($message === null) {
                    break;
                }
                if ($message === self::PONG_MESSAGE) {
                    echo '收到心跳响应 --> ' . $message . PHP_EOL;
                    continue;
                }
                //处理业务逻辑
                echo $message . PHP_EOL;
            } catch (TimeoutException $exception) {
                continue;
            }
        }
        $client->close();
    }

    protected function setAsyncSignals()
    {
        pcntl_async_signals(true);
    }

    protected function listenStopSignal()
    {
        pcntl_signal(SIGTERM, function () {
            $this->running = false;
        });
        pcntl_signal(SIGINT, function () {
            $this->running = false;
        });
    }

    protected function keepHeartbeat(int $seconds, Client $client)
    {
        pcntl_signal(SIGALRM, function () use ($client, $seconds) {
            if ($this->running) {
                $client->text(self::PING_MESSAGE);
                pcntl_alarm($seconds);
            }
        });
        pcntl_alarm($seconds);
    }
}
10个月前 评论
你是我的眼 (楼主) 10个月前

个人建议独立使用 workman 做 websocket 服务器,使用 GatewayWorker 能快速开发相关功能,前端通过调用 lLaravel 或者 tp 等 php 常规框架的接口,接口在调用 websocket 服务器,就能完美解决 websocket 通讯问题,实现了聊天室、客服,包括小程序中的各种实时交互与应用相关的功能。可以看 demo(https://element.wmhello.cn)

8个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!