v5.0 版本规划
Swoole 5.0 版本规划
master分支不再作为4.9,将调整为v5.0
概览
- 支持
PHP8.1 - 独立运行(
swoole-cli) - 强类型,所有函数、类方法的参数、返回值均是有类型的
- 强化底层服务治理能力
- 强制要求
PHP-8.0以上版本
新的运行模式
5.0将新增swoole-cli支持,swoole将像node.js这样作为独立程序提供给用户,而不是作为PHP的一个扩展。另外swoole-cli会尽可能地对php-src进行裁剪,移除一些不用的机制、模块、扩展、函数、类型、常量、代码,使得整个程序可以在几分钟之内编译完成。
htf@htf-ThinkPad-T470p:~/workspace/php/awsl-psl$ ./swoole-cli -n -v
Swoole 5.0.0 (cli) (built: Nov 26 2021 07:22:46)
静态编译无依赖
swoole-cli会全部使用静态编译连接方式,libc和libstdc++使用musl,并会包含openssl和curl库和扩展。用户可修改构建脚本添加其他更多三方扩展。
使得swoole程序不再依赖任何系统的so,可在任意Linux系统之间复制分发运行。
htf@htf-ThinkPad-T470p:~/workspace/php/awsl-psl$ ldd swoole-cli
不是动态可执行文件
htf@htf-ThinkPad-T470p:~/workspace/php/awsl-psl$
移除动态扩展加载机制
移除 dl() 函数和php.ini配置extension={name}.so的动态扩展加载机制,所有扩展必须为静态编译。
swoole-cli允许自定义构建系统,将扩展添加到模块列表中
移除 php -S 内置服务器
在swoole环境下没有意义
移除内置扩展
移除使用率低、历史遗留、不支持协程的内置扩展,包括但不限于:
com_dotnetdbaftpffiimapldapoci8odbcpdo_dblibpdo_firebirdpdo_ocipdo_odbcpdo_pgsqlpgsqlpspellshmopsnmpsysvmsgsysvsemtidy
移除函数
移除非 cli 模式、使用率低、历史遗留、不支持协程的内置函数,包括但不限于:
checkdnsrrdns_check_recorddns_get_mxheaderheader_register_callbackheader_removesession_startmail
移除 ZTS
移除ZTS模式,在cli模式下ZTS是没有任何意义的。
htf@htf-ThinkPad-T470p:~/workspace/php/awsl-psl$ ./swoole-cli -n -m
[PHP Modules]
Core
curl
date
filter
hash
helper
iconv
inotify
json
openssl
pcntl
pcre
posix
redis
Reflection
session
sockets
SPL
standard
swoole
[Zend Modules]
5.0版本中依然支持作为PHP扩展的运行模式,但在下一个大版本6.0中将会移除扩展支持,只提供swoole-cli模式
超大文件上传
从5.0开始HTTP服务器增加了对超大文件上传的支持,通过设置upload_max_filesize参数控制允许上传的文件最大尺寸。不同于package_max_length,超大文件上传功能是将form-data中的文件内容直接写入临时文件,这样的好处是不会占用太多内存,即可完成超大文件的上传。package_max_length可以设置为2M,upload_max_filesize设置为2G,每个连接只需要2M内存即可完成2G大文件的上传。
$server->set([
'upload_max_filesize' => 2 * 1024 * 1024 * 1024, // 2G
'package_max_length' => 2 * 1024 * 1024, // 2M
]);
新增
- 增加
Server配置项:max_concurrency,可限制HTTP1/2服务的最大并发请求数量,超过之后返回503错误 - 增加
Coroutine\Http\Client配置项:max_retries,在发生连接失败、HTTP 502/503时自动更换节点进行重试 - 增加
name_resolver全局配置项,强化域名解析能力,5.0之前的版本域名只能使用DNS解析,5.0之后可配置name_resolver将名字解析改为使用Consul或Nacos等服务发现插件 - 增加
Coroutine::getExecuteTime(),可获取协程实际执行时间(不包含处于yield状态的时间) - 增加
upload_max_filesize配置,允许上传超大文件
强化
- 强类型,所有函数和类方法的参数和返回值增加了类型限定
- 所有构造方法失败时全部修改为抛出异常
移除
- 移除
PSR-0风格类名,如swoole_http_server需要修改为Swoole\Http\Server - 移除自动在
shutdown function中添加Event::wait(),必须显式调用Event::wait()进入事件等待,或者使用Co\run()、Server::start()、Process::start()、Process\Pool::start()等容器 - 移除
Server::tick/after/clearTimer/defer别名,直接使用Timer::tick()/Timer::after()/Timer::clear()/Event::defer()
火钳刘明 swoole-cli将极大的增加php应用场景 提高便利性
Swoole HTTP Server 每个请求的超时控制有计划吗?#59
这个太棒了,可以更方便的给客户部署代码
@hhxsv5 即便是增加了最大执行时间,也只能是提前发送 HTTP 504 并关闭连接,但无法终止正在执行的 PHP 代码
好吧...,我调整dispatch_mode为3,尽可能避免将请求分配给被阻塞的Worker。
支持一下
php 的未来就靠 swoole 了
期待 V5
@matyhtf 有计划支持 homebrew 吗?
有计划支持 RFC-1016: 协程中断功能 https://github.com/swoole/community-chinese/issues/40 功能没?
我现在正在win环境下使用swoole-cli v4.8.10,其php-src版本为8.1.1,但是目前来说我的项目(Hyperf框架)不兼容8.1版本,导致项目无法运行,那么现在来说在不利用虚拟化技术的情况下如何解决这个问题?如果后期swoole团队将swoole-cli作为未来的主线开发,那么针对这种情况必须要有一个合适的解决方案或者思路,因为这种情况可能会影响到很多旧项目。
@tw2066 协程中断的特性,在4.8.0就支持了,使用Co::cancel()函数
这样会不会和 PHP 官方的差异越来越大!