当前位置: 首页 > 后端技术 > PHP

Swoole4.4正式版已经发布

时间:2023-03-30 01:19:27 PHP

向下不兼容的变化与官方PHP一致,不再支持PHP7.0(@matyhtf)移除Serialize模块,单独维护在ext-serialize扩展中。放弃原因:由于PHP内核变动频繁,导致无法实现稳定可用的模块。与phpserialize相比,没有太大区别。定位移除PostgreSQL模块并将其维护在单独的ext-postgresql扩展中。放弃原因:PostgreSQL使用异步回调实现协程调度,不符合目前内核协程化的统一规划。另外,PostgreSQL目前用户量很低,缺乏必要的单元测试,质量无法保证。Runtime::enableCoroutine将不再自动兼容协程内外环境。一旦启用,所有阻塞操作都必须在协程内调用(@matyhtf),由于引入了新的协程MySQL客户端驱动,底层设计更加标准化,但有一些向后不兼容的小变化fetch/nextResult进行了优化按需读取,IO调度启动defer特性时会生成statement发出的请求,当需要使用statement->recv接收并启动defer/fetch_mode特性时,如果有未接收到的数据,则不会能够发起新的请求。与异步不同的是,connected属性将不再根据事件实时更新,而是在IO操作失败后更新DeprecationWarningBuffer模块将被弃用。弃用原因:可替代性强,使用率低。可以用PHPstring和fopen("memory")代替。Lock模块会被丢弃,丢弃的原因是:协程模式下锁可能有问题。您可以使用chan来实现锁的协程版本。由于引入了stream_socket_pair协程,建议开启hook。如果有单独的配置需求,请使用SWOOLE_HOOK_STREAM_FUNCTIONConstant代替SWOOLE_HOOK_STREAM_SELECT新特性添加库,使用纯PHP编写内核函数而不是C/C++,提供以下函数新增高质量PHP模块Coroutine\WaitGroup(@twose)使用PHP代码实现CURLhook,一键开启CURL协程,目前是实验性功能,需要调用Runtime::enableCoroutine(SWOOLE_HOOK_CURL)开启(@matyhtf)(@Yurunsoft)使用PHP代码实现exec/shell_execcoroutine(#2657)(@Yurunsoft)enable在RuntimeHook中,函数array_walk将被替换,array_walk_recursive将是swoole实现的版本,解决了native函数不能重入的问题,但是会导致无法重入traverseobjects(@matyhtf)(@twose)添加了新的协程抢占式调度器,防止协程进程占用过多CPU时间导致其他协程饿死。通过php.ini配置swoole.enable_preemptive_scheduler=On开启。相关例子见preemptive_scheduler(@shiguangqi)添加Timer::list()返回Timer\Iterator,可以遍历所有Timer,Timer\clearAll清除所有定时器,Timer\info(int$id)获取定时器信息,Timer::stats()获取全局定时器状态(#2498)(@twose)添加Co\Socket两个第一个方法getOption和setOption(9d13c29)(@matyhtf)添加Process\Pool的$master_pid属性和关闭方法(a1d6eaa)(@matyhtf)添加Process\Pool的构造方法第四个参数,为true时底层会在onWorkerStart回调中自动启用Coroutine(8ceb32cd)(@matyhtf)添加stream_socket_pair协程支持(#2546)(@matyhtf)添加Http\Server的static_handler_locations设置,可以设置静态文件路径(@matyhtf)添加Co\Http\Client->setBasciAuth方法,使用自动发送Authorizationheader(#2542)(@hongbshi)新增Co\Http2\Client->ping方法(40041f6)(@shiguangqi)新增hook_flags配置项,用于替换Runtime::enableCoroutine()函数调用,增强新coroutineMySQL客户端驱动,底层完全协程化(#2538)(@twose)底层使用C++和协程编程方式(同步阻塞写法,异步表现)支持SSL连接(连接时可以配置['ssl'=>true],暂时不支持证书等配置)支持超大数据发送(无上限,底层自动打包,上限为MySQL服务器配置上限)支持s超大数据接收支持fetchreadbyrow(当前fetch按需读取,未取数据不会占用用户内存)(#2106)支持nextResult按需读取(同上)客户端关闭后,保留的statements客户端自动变为不可用,避免边界问题优化一些不必要的内存拷贝(协议解析时)日期相关类型小数精度支持错误码和符合PDO/mysqliCo\Redis兼容模式的信息,通过$redis->set(['compatibility_mode'=>true])开启,使hmGet/hGetAll/zRange/zRevRange/zRangeByScore/zRevRangeByScore等方法返回的结果与phpredis一致(#2529)(@caohao-php)默认100K允许协程同时存在(c69d320b)(@twose)支持bailout机制(协程发生致命错误时,进程可以正确退出)(#2579)(@twose)发生错误时,服务器会显示放置一个友好的400/404/503接口而不是没有输出。(@matyhtf)(f3f2be9d)服务端默认开启异步安全重启特性和发送大数据自动协程调度功能(#2555)(9d4a4c47)(@matyhtf)服务端onFinish回调支持自动协程环境(@twose)Httpclientwebsocket_mask端部默认开启,不会再出现无法连接websocket的莫名其妙问题(c02f4f85)(@twose)不再允许在协程外使用Channel调度操作(519b6043)(@twose)WebSocket握手失败时切断连接(#2510)(@twose)Linux下,当父进程异常退出时,底层会自动发送信号杀死子进程(4b833a3d)(@matyhtf)Socket->recv数据长度不足时回收末尾无用内存(642a3552)(@twose)浮点计算错误优化(#2572)(@tangl163)所有内置类禁止cloning/serializ底层定义属性的删除/删除(f9c974b8)(@twose)Server->bind会在uid超过UINT32_MAX时产生警告并向后兼容PHP7.4(#2506)(@twose)修复Process\Pool的getProcess问题(#2522)(@matyhtf)修复某些特殊情况下异常被忽略的问题(VM卡在事件循环中,没有机会检查异常)(@twose)修复进程后定时器导致的内存泄漏fork(8f3abee7)(@twose)修复非Linux系统编译时的时区问题(#2584)(@devnexen)修复enable_coroutine和task_enable_coroutine一开一关的Bug(#2585)(@matyhtf)修复Http2的trailer方法没有notoutputemptyheader(#2578)(@twose)FixCo\Http\Client->setCookiesmemoryerrorinspecialcases(#2644)(@Yurunsoft)fix#2639(#2656)(@mabu233)fixarginfo_swoole_process_pool_getProcess(#2658))(@mabu233)修复static_handler不支持软链接(@matyhtf)修复OSX下卡住的问题(22504dd4)(@matyhtf)修复taskprocessusingServer->getClientInfo启用SSL后报错(#2639)(@matyhtf)修复同一个Socket的多进程操作非法操作BUG(#2661)(@twose)协程调度器?添加Swoole\Coroutine\Scheduler调度类作为cli命令行脚本入口,代替go()+Swoole\Event::wait()添加Swoole\Coroutine\Run函数,为Swoole\Coroutine\Schedulergo()+Swoole\Event::wait()运行方式可能会被废除。核心持续底层代码质量优化工作(@swoole)moreunits测试,并使用基于webmozart/assert二次开发的断言库swoole/assert(@twose)完成内存申请失败检测(b19bebac)(5a1ddad3)(@matyhtf)彻底废除Windows支持计划,将部分协程组织功能组织成System或Scheduler模块,废除util模块Co\Http2\Client底层协程(f64874c3)(@matyhtf)底层完全缓存开发者注册的函数信息,调用回调更快(@twose)实验性内容可能会在5.0Co\Server和Co\Http\ServerCURLHook中加入(暂时不支持curl_multi)