MixPHP 发布 v3.0.27 支持 Swow

PHP技术
425
0
0
2022-10-05

MixPHP 发布 v3.0.27 支持 Swow

更新内容

  • 增加 Swow 支持
  • 增加 WebSocket, GRPC 的 swoolecopool 进程池支持

体验 Swow

本次更新主要支持了 Swow, 市面上唯二支持 Swow 的框架

安装

composer create-project --prefer-dist mix/api-skeleton api

运行

还没有安装 Swow 的可以参考文档先安装 Install, Swow 现在还未处于正式版可以先尝鲜体验
php bin/swow.php 
                              ____
 ______ ___ _____ ___   _____  / /_ _____
  / __ `__ \/ /\ \/ /__ / __ \/ __ \/ __ \
 / / / / / / / /\ \/ _ / /_/ / / / / /_/ /
/_/ /_/ /_/_/ /_/\_\  / .___/_/ /_/ .___/
                     /_/         /_/
System    Name:       linux
PHP       Version:    8.0.15
Swow      Version:    0.1.0
Listen    Addr:       http://0.0.0.0:9501
2022-04-16 20:32:00.415403  INFO  Start swow coroutine server

测试 Swow 性能

在性能上是优于 SwooleCoroutine 在未来的功能中也会支持协程Mongo, 多进程协程

wrk -c1000 -t10 http://localhost:9501
Running 10s test @ http://localhost:9501
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    54.09ms    2.97ms 124.98ms   97.74%
    Req/Sec     1.84k   156.88     2.02k    92.32%
  182698 requests in 10.08s, 9.06MB read
  Socket errors: connect 0, read 830, write 0, timeout 0
Requests/sec:  18128.02
Transfer/sec:      0.90MB

体验 Swow-WebSocket

编辑 bin/swow.php while 部分代码就可以

while (true) {
    $request = null;
    try {
        $request = $connection->recvHttpRequest();
        if (($upgrade = $request->getUpgrade()) && $upgrade === $request::UPGRADE_WEBSOCKET) {
            $connection->upgradeToWebSocket($request);
            while (true) {
                $frame = $connection->recvWebSocketFrame();
                $opcode = $frame->getOpcode();
                switch ($opcode) {
                    case WebSocketOpcode::PING:
                        $connection->sendString(WebSocketFrame::PONG);
                        break;
                    case WebSocketOpcode::PONG:
                        break;
                    case WebSocketOpcode::CLOSE:
                        break 2;
                    default:
                        $frame = new WebSocketFrame();
                        $frame->setPayloadData('Hello Swow!');
                        $connection->sendWebSocketFrame($frame);
                }
            }
            break;
        }
        $handler = $this->handler;
        $handler($request, $connection);
    } catch (ResponseException $exception) {
        $connection->error($exception->getCode(), $exception->getMessage());
    }
    if (!$request || !$request->getKeepAlive()) {
        break;
    }
}

链接 WebSocket 发送内容 hello 收到回复 hello Swow! 通过 jmeter 测试 SwowWebSocket的性能也是相当恐怖的

ws.png

关于MixPHP

MixPHP 是一个 PHP 命令行模式开发框架;基于 Vega 驱动的 HTTP 可以同时支持 Swoole、Swow、WorkerMan、FPM、CLI-Server 生态,并且可以无缝切换。 你可以只使用 mix/vega 来搭配 laravel orm 使用;可以在任意环境中使用 mix/database 和 mix/redis;可以使用 mix/grpc 原生代码编写 gRPC;所有的模块你可以像搭积木一样随意组合。性能强劲在 TechEmpower Benchmark霸榜前十。

开箱即用, 灵活组合

当我们在本地开发时, 没有安装 Swow/Swoole 可以使用 cli/fpm 本地开发, 上线使用 Swoole/Swow/Workerman 使用框架不用担心底层切换。

支持多种服务器驱动,并且可以无缝切换。

  • PHP Built-in CLI-Server 零扩展依赖 热更新 适合本机开发
  • PHP-FPM 热更新 适合共享开发 适合 admin 开发
  • Swoole 常驻内存 兼容 composer 生态
  • Swoole Coroutine 常驻内存 协程性能强劲
  • Swow 常驻内存 纯协程引擎
  • WorkerMan 常驻内存 兼容 composer 生态

官网及交流

github.com/mix-php/mix (点Star支持一下)

gitee.com/mix-php/mix (点Star支持一下)