🚀 Hyperf 发布 WebSocket 组件 及 多个组件 v1.0.3 更新 | 企业级的 PHP 微服务协程框架

v1.0.3 更新内容

本次更新涉及以下组件,主要新增了 WebSocket 服务端WebSocket 协程客户端 组件,以及修复了一些 Bug
hyperf/constants
hyperf/database
hyperf/di
hyperf/framework
hyperf/http-server
hyperf/json-rpc
hyperf/model-cache
hyperf/websocket-client
hyperf/websocket-server

Added

  • #48 增加 WebSocket 协程客户端及服务端
  • #51 增加了 enableCache 参数去控制 DefinitionSource 是否启用注解扫描缓存
  • #61 通过 db:model 命令创建模型时增加属性类型
  • #65 模型缓存增加 JSON 格式支持

Changed

  • #46 移除了 hyperf/di, hyperf/command and hyperf/dispatcher 组件对 hyperf/framework 组件的依赖

Fixed

  • #45 修复当引用了 hyperf/websocket-server 组件时有可能会导致 HTTP Server 启动失败的问题
  • #55 修复方法级别的 @Middleware 注解可能会被覆盖的问题
  • #73 修复 db:model 命令对短属性处理不正确的问题
  • #88 修复当控制器存在多层文件夹时生成的路由可能不正确的问题
  • #101 修复常量不存在 @Message 注解时会报错的问题

WebSocket 服务

Hyperf 提供了对 WebSocket Server 的封装,可基于 hyperf/websocket-server 组件快速搭建一个 WebSocket 应用。

安装

composer require hyperf/websocket-server

配置 Server

修改 config/autoload/server.php,增加以下配置。

<?php

'servers' => [
    [
        'name' => 'ws',
        'type' => Server::SERVER_WEBSOCKET,
        'host' => '0.0.0.0',
        'port' => 9502,
        'sock_type' => SWOOLE_SOCK_TCP,
        'callbacks' => [
            SwooleEvent::ON_HAND_SHAKE => [Hyperf\WebSocketServer\Server::class, 'onHandShake'],
            SwooleEvent::ON_MESSAGE => [Hyperf\WebSocketServer\Server::class, 'onMessage'],
            SwooleEvent::ON_CLOSE => [Hyperf\WebSocketServer\Server::class, 'onClose'],
        ],
    ],
],

配置路由

目前暂时只支持配置文件的模式配置路由,后续会提供注解模式。

config/routes.php 文件内增加对应 ws 的 Server 的路由配置,这里的 ws 值取决于您在 config/autoload/server.php 内配置的 WebSocket Server 的 name 值。

<?php

Router::addServer('ws', function () {
    Router::get('/', 'App\Controller\WebSocketController');
});

创建对应控制器

<?php
declare(strict_types=1);

namespace App\Controller;

use Hyperf\Contract\OnCloseInterface;
use Hyperf\Contract\OnMessageInterface;
use Hyperf\Contract\OnOpenInterface;
use Swoole\Http\Request;
use Swoole\Server;
use Swoole\Websocket\Frame;

class WebSocketController implements OnMessageInterface, OnOpenInterface, OnCloseInterface
{
    public function onMessage(Server $server, Frame $frame): void
    {
        $server->push($frame->fd, 'Recv: ' . $frame->data);
    }

    public function onClose(Server $server, int $fd, int $reactorId): void
    {
        var_dump('closed');
    }

    public function onOpen(Server $server, Request $request): void
    {
        $server->push($request->fd, 'Opened');
    }
}

接下来启动 Server,便能看到对应启动了一个 WebSocket Server 并监听于 9502 端口,此时您便可以通过各种 WebSocket Client 来进行连接和进行数据传输了。

$ php bin/hyperf.php start

[INFO] Worker#0 started.
[INFO] WebSocket Server listening at 0.0.0.0:9502
[INFO] HTTP Server listening at 0.0.0.0:9501

WebSocket 协程客户端

Hyperf 提供了对 WebSocket Client 的封装,可基于 hyperf/websocket-client 组件对 WebSocket Server 进行访问;

安装

composer require hyperf/websocket-client

使用

组件提供了一个 Hyperf\WebSocketClient\ClientFactory 来创建客户端对象 Hyperf\WebSocketClient\Client,我们直接通过代码来演示一下:

<?php
declare(strict_types=1);

namespace App\Controller;

use Hyperf\Di\Annotation\Inject;

class IndexController extends Controller
{

    /**
     * @Inject()
     * @var \Hyperf\WebSocketClient\ClientFactory
     */
    protected $clientFactory;

    public function index()
    {
        // 对端服务的地址,如没有提供 ws:// 或 wss:// 前缀,则默认补充 ws://
        $host = '127.0.0.1:9502';
        // 通过 ClientFactory 创建 Client 对象,创建出来的对象为短生命周期对象
        $client = $this->clientFactory->create($host);
    }
}

自动关闭连接开关

默认情况下,创建出来的 Client 对象会通过 defer 自动 close 连接,如果您希望不自动 close,可在创建 Client 对象时传递第二个参数 $autoClosefalse

<?php

$autoClose = false;
$clientFactory->create($host, $autoClose);

关于 Hyperf

Hyperf 是基于 Swoole 4.3+ 实现的高性能、高灵活性的 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于 PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均均基于 PSR 标准 实现,基于强大的依赖注入设计,保证了绝大部分组件或类都是 可替换可复用 的。
   
框架组件库除了常见的协程版的 MySQL 客户端Redis 客户端,还为您准备了协程版的 Eloquent ORMJSON RPC 服务的及客户端GRPC 服务端及客户端Zipkin (OpenTracing) 客户端Guzzle HTTP 客户端Elasticsearch 客户端Consul 客户端ETCD 客户端AMQP 组件Apollo 配置中心阿里云 ACM 应用配置管理基于令牌桶算法的限流器通用连接池熔断器Swagger 文档生成 等组件,省去了自己实现对应协程版本的麻烦,Hyperf 还提供了 基于 PSR-11 的依赖注入容器注解AOP 面向切面编程基于 PSR-15 的中间件自定义进程基于 PSR-14 的事件管理器Redis/RabbitMQ 消息队列自动模型缓存基于 PSR-16 的缓存 等非常便捷的功能,满足丰富的技术场景和业务场景,开箱即用。

框架初衷

尽管现在基于 PHP 语言开发的框架处于一个百花争鸣的时代,但仍旧未能看到一个优雅的设计与超高性能的共存的完美框架,亦没有看到一个真正为 PHP 微服务铺路的框架,此为 Hyperf 及其团队成员的初衷,我们将持续投入并为此付出努力,也欢迎你加入我们参与开源建设。

设计理念

Hyperspeed + Flexibility = Hyperf,从名字上我们就将 超高速灵活性 作为 Hyperf 的基因。
   

  • 对于超高速,我们基于 Swoole 协程并在框架设计上进行大量的优化以确保超高性能的输出。   
  • 对于灵活性,我们基于 Hyperf 强大的依赖注入组件,组件均基于 PSR 标准 的契约和由 Hyperf 定义的契约实现,达到框架内的绝大部分的组件或类都是可替换的。   

基于以上的特点,Hyperf 将存在丰富的可能性,如实现 Web 服务,网关服务,分布式中间件,微服务架构,游戏服务器,物联网(IOT)等。

文档齐全

我们投入了大量的时间用于文档的建设,以解决各种因为文档缺失所带来的问题,文档上也提供了大量的示例,对新手同样友好。

生产可用

我们为组件进行了大量的单元测试以保证逻辑的正确,同时维护了高质量的文档,在 Hyperf 正式对外开放(2019年6月20日)之前,便已在一家 C轮 和一家 B轮 互联网公司上线了多个服务并以稳定的姿态完美的运行了超过半年时间,经过了严酷的生产环境 (如618) 的考验,我们才正式的对外开放该项目。   

官网及交流

Github <- 点 Star 支持我们   
Hyperf 官网   
QQ 群: 862099724   

本帖已被设为精华帖!
本帖由系统于 4年前 自动加精
讨论数量: 2

一直在关注此框架,望增加更多优秀的特性,能像Laravel一样优雅、高效

4年前 评论
游离不2

不支持分布式的websocket都是渣渣

4年前 评论

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