rfc icon indicating copy to clipboard operation
rfc copied to clipboard

v5.0 版本规划

Open matyhtf opened this issue 3 years ago • 13 comments

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会全部使用静态编译连接方式,libclibstdc++使用musl,并会包含opensslcurl库和扩展。用户可修改构建脚本添加其他更多三方扩展。 使得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_dotnet
  • dba
  • ftp
  • ffi
  • imap
  • ldap
  • oci8
  • odbc
  • pdo_dblib
  • pdo_firebird
  • pdo_oci
  • pdo_odbc
  • pdo_pgsql
  • pgsql
  • pspell
  • shmop
  • snmp
  • sysvmsg
  • sysvsem
  • tidy

移除函数

移除非 cli 模式、使用率低、历史遗留、不支持协程的内置函数,包括但不限于:

  • checkdnsrr
  • dns_check_record
  • dns_get_mx
  • header
  • header_register_callback
  • header_remove
  • session_start
  • mail

移除 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可以设置为2Mupload_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将名字解析改为使用ConsulNacos等服务发现插件
  • 增加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()

matyhtf avatar Dec 22 '21 05:12 matyhtf

火钳刘明 swoole-cli将极大的增加php应用场景 提高便利性

GXhua avatar Dec 22 '21 05:12 GXhua

Swoole HTTP Server 每个请求的超时控制有计划吗?#59

hhxsv5 avatar Dec 22 '21 14:12 hhxsv5

这个太棒了,可以更方便的给客户部署代码

maxincai avatar Dec 23 '21 07:12 maxincai

@hhxsv5 即便是增加了最大执行时间,也只能是提前发送 HTTP 504 并关闭连接,但无法终止正在执行的 PHP 代码

matyhtf avatar Dec 24 '21 09:12 matyhtf

好吧...,我调整dispatch_mode为3,尽可能避免将请求分配给被阻塞的Worker

hhxsv5 avatar Dec 24 '21 12:12 hhxsv5

支持一下

QiuTF avatar Jan 11 '22 03:01 QiuTF

php 的未来就靠 swoole 了

liumingzhij26 avatar Jan 11 '22 03:01 liumingzhij26

期待 V5

kids-return avatar Jan 11 '22 03:01 kids-return

@matyhtf 有计划支持 homebrew 吗?

huangdijia avatar Jan 11 '22 06:01 huangdijia

有计划支持 RFC-1016: 协程中断功能 https://github.com/swoole/community-chinese/issues/40 功能没?

tw2066 avatar Jan 11 '22 07:01 tw2066

我现在正在win环境下使用swoole-cli v4.8.10,其php-src版本为8.1.1,但是目前来说我的项目(Hyperf框架)不兼容8.1版本,导致项目无法运行,那么现在来说在不利用虚拟化技术的情况下如何解决这个问题?如果后期swoole团队将swoole-cli作为未来的主线开发,那么针对这种情况必须要有一个合适的解决方案或者思路,因为这种情况可能会影响到很多旧项目。

Moxyu avatar Jun 02 '22 10:06 Moxyu

@tw2066 协程中断的特性,在4.8.0就支持了,使用Co::cancel()函数

matyhtf avatar Jun 24 '22 02:06 matyhtf

这样会不会和 PHP 官方的差异越来越大!

cxlblm avatar Jul 06 '22 05:07 cxlblm