前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swoole 4.4 正式版已发布

Swoole 4.4 正式版已发布

作者头像
猿哥
发布2019-07-17 16:42:49
9330
发布2019-07-17 16:42:49
举报
文章被收录于专栏:Web技术布道师Web技术布道师

向下不兼容改动

  • PHP 官方保持一致, 不再支持 PHP7.0 (@matyhtf)
  • 移除 Serialize 模块, 在单独的 ext-serialize 扩展中维护. 废弃原因: 由于 PHP 内核频繁变更, 导致无法实现稳定可用的模块, 与 php serialize 相比没有太大差异化定位
  • 移除 PostgreSQL 模块,在单独的 ext-postgresql 扩展中维护. 废弃原因: PostgreSQL 使用了异步回调方式实现协程调度, 不符合目前内核协程化的统一规划。另外 PostgreSQL 目前用户量非常低, 并且缺少必要的单元测试, 无法保证质量
  • Runtime::enableCoroutine 不再会自动兼容协程内外环境, 一旦开启, 则一切阻塞操作必须在协程内调用 (@matyhtf)
  • 由于引入了全新的协程 MySQL 客户端驱动, 底层设计更加规范, 但有一些小的向下不兼容的变化
    • fetch/nextResult 优化为按需读取, 会产生IO调度
    • 启动 defer 特性时, statement 发出的的请求, 需要使用 statement->recv 接收
    • 启动 defer/fetch_mode 特性时, 如有未接收完的数据, 将无法发起新的请求
    • 与异步不同, connected 属性不再会实时基于事件更新, 而是在 IO 操作失败后更新

废弃警告

  • 将废弃 Buffer 模块,废弃原因:可替代性强,使用率低,可用 PHP 字符串、 fopen("memory") 代替。
  • 将废弃 Lock 模块,废弃原因:在协程模式下加锁可能存在问题,可使用 chan 实现协程版本的锁
  • 由于引入了 stream_socket_pair 协程化, 建议开启hook时, 如有单独配置需求, 请使用 SWOOLE_HOOK_STREAM_FUNCTION 常量而不是 SWOOLE_HOOK_STREAM_SELECT

新特性

  • 新增 Library , 使用纯 PHP 编写内核功能而非 C/C++ , 提供了以下功能
    • 新增高质量 PHP 模块 Coroutine\WaitGroup (@twose)
    • 使用 PHP 代码实现CURL的hook, 一键使CURL协程化, 目前为实验特性, 需特别调用 Runtime::enableCoroutine(SWOOLE_HOOK_CURL) 来开启 (@matyhtf) (@Yurunsoft)
    • 使用 PHP 代码实现 exec / shell_exec 的协程化 (#2657) (@Yurunsoft)
    • 开启 RuntimeHook 时, 将替换函数 array_walk , array_walk_recursive 为swoole实现的版本, 解决原生函数不可重入的问题, 但会造成无法遍历object (@matyhtf) (@twose)
  • 新增协程抢占式调度器, 可防止协程占用CPU时间过长导致其它协程饿死, 通过 php.ini 配置swoole.enable_preemptive_scheduler = On 开启, 相关例子详见 preemptive_scheduler (@shiguangqi)
  • 新增 Timer::list() 返回 Timer\Iterator , 可遍历所有定时器, Timer\clearAll 清除所有定时器, Timer\info(int $id) 获取定时器信息, Timer::stats() 获取全局定时器状态 (#2498) (@twose)
  • 新增 Co\Socket 的两个方法 getOptionsetOption (9d13c29) (@matyhtf)
  • 新增 Process\Pool$master_pid 属性和 shutdown 方法 (a1d6eaa) (@matyhtf)
  • 新增 Process\Pool 的构造方法的第四个参数, 为true时底层将自动在 onWorkerStart 回调开启协程 (8ceb32cd) (@matyhtf)
  • 新增 stream_socket_pair 协程化支持 (#2546) (@matyhtf)
  • 新增 Http\Serverstatic_handler_locations 设置, 可以设定静态文件路径 (@matyhtf)
  • 新增 Co\Http\Client->setBasciAuth 方法, 用于自动发送 Authorization 头 (#2542) (@hongbshi)
  • 新增 Co\Http2\Client->ping 方法 (40041f6) (@shiguangqi)
  • 新增 hook_flags 配置项,用于取代 Runtime::enableCoroutine() 函数调用

增强

  • 全新的协程 MySQL 客户端驱动, 底层全面协程化 (#2538) (@twose)
    • 底层使用 C++ 和协程的编程模式(同步阻塞写法, 异步性能)
    • 支持SSL连接 (connect时配置 ['ssl' => true] 即可, 暂不支持证书等配置)
    • 支持超大数据发送 (无上限, 底层自动拼包, 上限为MySQL服务器配置上限)
    • 支持超大数据接收
    • 支持 fetch 按行读取 (现在的 fetch 为按需读取, 未fetch的数据不会耗费用户内存) ( #2106 )
    • 支持 nextResult 按需读取 (同上)
    • 客户端 close 后, 客户端持有的 statements 自动转为不可用状态, 避免边界问题
    • 优化掉了一些不必要的内存拷贝(协议解析时)
    • date 相关类型小数精度支持
    • 错误代码和信息与 PDO / mysqli 保持一致
  • Co\Redis 兼容模式, 通过 $redis->set(['compatibility_mode' => true]) 开启, 可使得 hmGet/hGetAll/zRange/zRevRange/zRangeByScore/zRevRangeByScore 等方法返回结果和 phpredis保持一致 (#2529) (@caohao-php)
  • 默认允许有 100K 个协程同时存在 (c69d320b) (@twose)
  • 支持 bailout 机制 (协程内发生致命错误时能正确退出进程) (#2579) (@twose)
  • Server 发生错误时会根据情况展示友好的 400/404/503 界面而不是没有任何输出 (@matyhtf) (f3f2be9d)
  • Server 默认开启异步安全重启特性和超大数据发送的自动协程调度功能 (#2555) (9d4a4c47) (@matyhtf)
  • ServeronFinish 回调支持自动协程环境 (@twose)
  • Http 客户端默认开启 websocket_mask , 不再会出现莫名其妙连不上 websocket 的问题 (c02f4f85) (@twose)
  • 不再允许在协程外使用 Channel 的调度操作 (519b6043) (@twose)
  • WebSocket 握手失败时切断连接 (#2510) (@twose)
  • Linux 下父进程异常退出时底层会自动发送信号杀死子进程 (4b833a3d) (@matyhtf)
  • Socket->recv 的数据长度不足时回收末尾无用的内存 (642a3552) (@twose)
  • 浮点数计算误差优化 (#2572) (@tangl163)
  • 所有内置类都 禁止克隆/禁止序列化/禁止删除底层定义的属性 (f9c974b8) (@twose)
  • Server->binduid 超过 UINT32_MAX 时会产生警告并返回
  • 兼容 PHP7.4 (#2506) (@twose)

修复

  • 修复 Process\PoolgetProcess 问题 (#2522) (@matyhtf)
  • 修复某些特殊情况下异常被忽略的问题(VM陷入了事件循环而没有机会检查异常) (@twose)
  • 修复定时器在进程 fork 后产生的内存泄漏 (8f3abee7) (@twose)
  • 修复非Linux系统编译时timezone的问题 (#2584) (@devnexen)
  • 修复 enable_coroutinetask_enable_coroutine 一开一关的问题 (#2585) (@matyhtf)
  • 修复Http2的trailer方法不输出值为空的头 (#2578) (@twose)
  • 修复 Co\Http\Client->setCookies 在特殊情况下的内存错误 (#2644) (@Yurunsoft)
  • 修复#2639 (#2656) (@mabu233)
  • 修复 arginfo_swoole_process_pool_getProcess (#2658) (@mabu233)
  • 修复 static_handler 不支持软链接 (@matyhtf)
  • 修复 OSX 下卡死 (22504dd4) (@matyhtf)
  • 修复启用 SSLtask 进程使用 Server->getClientInfo 出错 (#2639) (@matyhtf)
  • 修复多协程操作同一个Socket的非法操作BUG (#2661) (@twose)

协程调度器 ?

  • 新增 Swoole\Coroutine\Scheduler 调度器类作为 cli 命令行脚本的入口,取代 go() + Swoole\Event::wait() 的方式
  • 增加 Swoole\Coroutine\Run 函数,提供对 Swoole\Coroutine\Scheduler 的封装
  • go() + Swoole\Event::wait() 的运行方式可能被废除

内核

  • 持续的底层代码质量优化工作 (@swoole)
  • 更多的单元测试, 并使用了基于 webmozart/assert 二次开发而来的断言库 swoole/assert (@twose)
  • 补全内存申请失败检测 (b19bebac) (5a1ddad3) (@matyhtf)
  • 彻底废除 Windows 支持计划
  • 将协程的一些功能整理划分到 SystemScheduler 模块, 废除util模块
  • Co\Http2\Client 底层协程化 (f64874c3) (@matyhtf)
  • 底层全面缓存了开发者注册的函数信息, 调用回调时速度更快 (@twose)

实验性内容

  • 可能在 5.0 新增的 Co\ServerCo\Http\Server
  • CURL Hook (暂时不支持 curl_multi
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PHP技术大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 向下不兼容改动
  • 废弃警告
  • 新特性
  • 增强
  • 修复
  • 协程调度器 ?
  • 内核
  • 实验性内容
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档