向下不兼容改动
- 和
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
的两个方法getOption
和setOption
(9d13c29) (@matyhtf) - 新增
Process\Pool
的$master_pid
属性和shutdown
方法 (a1d6eaa) (@matyhtf) - 新增
Process\Pool
的构造方法的第四个参数, 为true时底层将自动在onWorkerStart
回调开启协程 (8ceb32cd) (@matyhtf) - 新增
stream_socket_pair
协程化支持 (#2546) (@matyhtf) - 新增
Http\Server
的static_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) -
Server
的onFinish
回调支持自动协程环境 (@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->bind
在uid
超过UINT32_MAX
时会产生警告并返回 - 兼容
PHP7.4
(#2506) (@twose)
修复
- 修复
Process\Pool
的getProcess
问题 (#2522) (@matyhtf) - 修复某些特殊情况下异常被忽略的问题(VM陷入了事件循环而没有机会检查异常) (@twose)
- 修复定时器在进程
fork
后产生的内存泄漏 (8f3abee7) (@twose) - 修复非Linux系统编译时timezone的问题 (#2584) (@devnexen)
- 修复
enable_coroutine
和task_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) - 修复启用
SSL
后task
进程使用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
支持计划 - 将协程的一些功能整理划分到
System
或Scheduler
模块, 废除util模块 -
Co\Http2\Client
底层协程化 (f64874c3) (@matyhtf) - 底层全面缓存了开发者注册的函数信息, 调用回调时速度更快 (@twose)
实验性内容
- 可能在
5.0
新增的Co\Server
和Co\Http\Server
-
CURL Hook
(暂时不支持curl_multi
)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。