乐趣区

Swoft-207-如期而至

什么是 Swoft ?

Swoft 是一款基于 Swoole 扩展实现的 PHP 微服务协程框架。Swoft 能像 Go 一样,内置协程网络服务器及常用的协程客户端且常驻内存,不依赖传统的 PHP-FPM。有类似 Go 语言的协程操作方式,有类似 Spring Cloud 框架灵活的注解、强大的全局依赖注入容器、完善的服务治理、灵活强大的 AOP、标准的 PSR 规范实现等等。

Swoft 通过长达三年的积累和方向的探索,把 Swoft 打造成 PHP 界的 Spring Cloud, 它是 PHP 高性能框架和微服务治理的最佳选择。

Github

  • https://github.com/swoft-clou…

Swoft v2.0.7

2.0.72.0.6 上继续扬帆,已在大量的生产业务中使用,得到很多用户的肯定和支持。正式版本我们做了许多改进和优化,拥有了更好的性能。

  • 新增 Http Session 功能组件,提供 http 会话管理, 支持多种存储驱动
  • 增强 TCP server 请求支持添加全局或对应的方法中间件
  • 增强 Websocket server 消息请求支持添加全局或对应的方法中间件

Http Session

通过 Composer 安装 swoft/session 组件

  • 在项目 composer.json 所在目录执行 composer require swoft/session
  • Swoft\Http\Session\SessionMiddleware 中间件加入到全局中间件

在配置文件 app/bean.php 里:

    'httpDispatcher'    => [
        // Add global http middleware
        'middlewares'      => [\Swoft\Http\Session\SessionMiddleware::class,],
    ],

默认是基于本地文件驱动,保存在 runtime/sessions 目录

更在驱动只需要配置对应 handler 类,例如配置 Redis 驱动:

'sessionHandler' => [
    'class'    => RedisHandler::class,
    // Config redis pool
    'redis' => bean('redis.pool')
],

Websocket 消息中间件

  • 全局中间件

配置于 app/bean.php:

    /** @see \Swoft\WebSocket\Server\WsMessageDispatcher */
    'wsMsgDispatcher' => [
        'middlewares' => [\App\WebSocket\Middleware\GlobalWsMiddleware::class],
    ],
  • 作用于控制器的
/**
 * Class HomeController
 *
 * @WsController(middlewares={DemoMiddleware::class})
 */
class TestController
{}

TCP 请求中间件

  • 全局中间件

配置于 app/bean.php:

    /** @see \Swoft\Tcp\Server\TcpDispatcher */
    'tcpDispatcher' => [
        'middlewares' => [\App\Tcp\Middleware\GlobalTcpMiddleware::class],
    ],
  • 作用于控制器的
/**
 * Class DemoController
 *
 * @TcpController(middlewares={DemoMiddleware::class})
 */
class DemoController
{// ....}

Github

  • https://github.com/swoft-clou…

更新记录

升级提示:

  • Swoole\WebSocket\Server::push 第四个参数 $finish 在 swoole 4.4.12 后改为了 int 类型。
  • tcp server 的 TcpServerEvent::CONNECT 事件参数保持跟 receive, close 一致。$fd, $server 互换位置。

修复(Fixed)

  • 修复 config 注入时,没有找到值也会使用对应类型的默认值覆盖属性,导致属性默认值被覆盖 d84d50a7
  • 修复 ws server 中使用 message 调度时,没有过滤空数据,导致多发出一个响应。避免方法 swoft-cloud/swoft#1002 d84d50a7
  • 修复 tcp server 中使用 message 调度时,没有过滤空数据,导致多发出一个响应。07a01ba1
  • 修复 独立使用 console 组件时缺少 swoft/stdlib 库依赖 c569c81a
  • 修复 ArrayHelper::get 传入 key 为 integer 时,报参数错误 a44dcad
  • 修复 console 渲染使用 table,有 int 值时,计算宽度报类型错误 74a835ab
  • 修复 error 组件中用户无法自定义设置默认的错误处理级别 4c78aeb
  • 修复 启用和禁用 组件设置 isEnable() 不生效的问题 da8c51e56
  • 修复 在 cygwin 环境使用 uniqid() 方法必须将第二个参数设置为 true c7f688f
  • 修复 在 cygwin 环境不能够设置进程 title 而导致报错 c466f6a
  • 修复 使用 http response->delCookie() 无法删除浏览器的 cookie 数据问题 8eb9241
  • 修复 ws server 消息调度时,接收到的 ext 数据不一定是数组导致报错 ff45b35
  • 修复 日志文件按时间拆分问题 c195413
  • 修复 日志 JSON 格式小问题 a3fc6b9
  • 修复 rpc 服务提供者 getList 调用两次问题 fd03e71
  • 修复 redis cluster 不支持 auth 参数 7a678f
  • 修复 模型查询 json 类型, 不支持 array 6023a9
  • 修复 redis multi 操作没有及时是否连接 e5f698
  • 修复 redis 不支持 expireAt, geoRadius 749241
  • 修复 crontab 时间戳检测偏差问题 eb08a46

更新(Update):

  • 更新 console 在渲染 help 信息之前也会发出事件 ConsoleEvent::SHOW_HELP_BEFORE d3f7bc3
  • 简化和统一 http, ws, tcp, rpc server 管理命令逻辑 f202c826
  • 更新 ws 和 tcp Connection 类添加 newFromArraytoArray 方法,方便通过第三方存储 (redis) 时导出信息和恢复连接 a8b0b7c
  • 优化 server 添加统一的 swoole pipe message 事件处理,在 ws, tcp 中使用 swoft 事件来处理进程间消息 1c51a8c

增强(Enhancement)

  • 现在 tcp 请求支持添加全局或对应的方法中间件,流程和使用跟 http 中间件类似。_仅当使用系统调度时有用_ 6b593877
  • 现在 websocket message 请求支持添加全局或对应的方法中间件,流程和使用跟 http 中间件类似。_仅当使用系统调度时有用_ 9739815
  • 事件管理允许设置 destroyAfterFire 在每次事件调度后清理事件中携带的数据 50bf43d3
  • 数据库错误异常新增 code 返回 fd306f4
  • 协程文件操作 writeFile 新增写失败异常 08c4244
  • RPC 新增参数验证 8646fc5
退出移动版