rfc
rfc copied to clipboard
Swoole 提案
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`进行裁剪,移除一些不用的机制、模块、扩展、函数、类型、常量、代码,使得整个程序可以在几分钟之内编译完成。 ```shell htf@htf-ThinkPad-T470p:~/workspace/php/awsl-psl$ ./swoole-cli -n...
协程中断 --- + 支持所有协程阻塞事件的中断(取消操作)(`Co::cancel`) + 支持PHP层的协程中断+异常抛出 (`Co::throw`) + 支持PHP层的杀死协程 (`Co::kill`) ### 需要了解的概念 以上三个功能都是基于协程中断特性的, 只有处于`cancelable`(可取消)的操作中的协程才能被`取消/置异常/杀死`, 当你成功中断一个协程时, 上下文环境将会立即切换到对应协程中 尝试`取消/置异常/杀死`一个处于不可取消操作中的协程, 将会返回false, 此时调用`swoole_last_error()`返回值为`SWOOLE_ERROR_CO_NONCANCELABLE_OPERATION` 尝试`取消/置异常/杀死`一个不存在的协程, 将会返回false, 此时调用`swoole_last_error()`返回值为`SWOOLE_ERROR_CO_NOT_EXIST` 尝试`置异常`一个协程成功后, 协程内抛出的异常的错误码`$e->getCode`值为`SWOOLE_ERROR_CO_INTERRUPTED_BY_EXCEPTION`, 并且异常将可以通过`$e->getOriginCid()`, `$e->getOriginFile()`, `$e->getOriginFile()`, `$e->getOriginTrace()` 来获取是哪个协程的哪个位置将当前协程置异常的 ###...
Swoole 底层服务治理框架 ===== 在 swoole 中提供了一套服务器治理的解决方案,有以下几点优势: * 同时支持 PHP-FPM、SWOOLE 协程模式、SWOOLE 同步模式或其他同步 Server(如:Workerman) * 无侵入实现,PHP 应用层代码直接使用 `file_get_cotents`、`curl`、`Swoole\Coroutine\Http\Client` 等 API 即可 * 完整的服务治理方案,从客户端到服务器端一体化设计 服务发现 ---- 支持`Consul`、`Nacos`等常见的服务注册发现组件,底层可自动替换`DNS`,无需应用层更改代码。 #### file_get_contents ```php // GET $json...
### 需求:**日志分割后,日志文件扩展名保持不变,日志文件名类似swoole_log.20211117.txt而不是swoole_log.txt.20211117** ``` 'log_file' => "{$directory}/data/{$logDirectory}/swoole_log.txt" ,//日志文件 'log_rotation' => SWOOLE_LOG_ROTATION_DAILY, //日志分割,每日 'log_date_format' => '%Y-%m-%d %H:%M:%S', //日志时间格式,格式参考 strftime 的 format ``` 如上配置,目前最新的Swoole 4.8.1按照指定的时间格式每日分割日志,每日的日志文件的扩展名并不是我指定的txt, 而是由年月日组成的数字,导致扩展名改变,而且扩展名还不重复。 在Linux云服务器上,如果只是查看文件,扩展名是啥无所谓。 1. 本地开发,使用Linux的samba服务 + windows映射为网络驱动器, 可以用windows下的PhpStorm写代码,当然也可以查看日志。但是,日志扩展名是由年月日组成的数字组合,windows系统不认得,然后,日志扩展名还不重复,那么,就得让PhpStorm一个一个认识这些扩展名, 实在麻烦。于是不得不(通过执行php命令)批量重命名日志文件,批量修改扩展名。...
## 背景 目前在`Swoole\Http\Server`中每个请求的最大执行时间没有限制,无法终止一些耗时的请求,只有靠上层`Nginx`配置`proxy_read_timeout`来间接地取消请求,但这样对客户端不够友好。 ## 提议 希望能增加配置项`time_limit`来限制每个请求的最大可执行时间(类似于[set_time_limit](https://www.php.net/manual/zh/function.set-time-limit.php)),超时后能有个回调,来动态地给出超时的响应。 ```php $serv->set([ 'time_limit' => 30, // 每个请求的最大执行时间 30s,设置为0表示不限制 'time_limit_callback' => function(Swoole\Http\Request $request, Swoole\Http\Response $response, $timeLimit) { $response->end(sprintf('响应超时:%.1f秒', $timeLimit)); } ]); ```
参考:https://github.com/swoole/community-chinese/issues/76 客户端支持 `name_resolver` 后,服务端可以在此基础上实现服务注册。 名字服务只支持`IPv4`和`IPv6`协议的端口,对`UnixSocket`端口无效。 接口原型 ---- ```php interface RegisterInterface { function join(string $service_name, string $ip, int $port); function leave(string $service_name, string $ip, int $port); } ``` 客户端 ---- ```php...
SwooleTable目前使用Hash作为索引,这导致其容量只能为2的次幂,且存在冲突比例的问题,想要将其用作可靠的数据库时总会有些顾虑。 类比php中的`array`与`SplFixedArray`。如果可以实现一种操作方式类似于SwooleTable,但是索引方式是直接通过偏移量。这样就可以精确的申请到需要的size,而且不要考虑冲突的问题。使用偏移量作为索引,性能也会比Hash索引更强悍,在此基础之上就可以实现更复杂图、树等结构。
# Swoole 5.0 版本请求意见稿 ### 项目方向 Swoole项目从创建至今已经有超过6年的历史了, 但Swoole协程却是一个全新的事物, 随着4.0版本Swoole的有栈协程问世, Swoole的协程化才真正步入了稳定发展阶段. Swoole从4.0开始一直致力于提升底层代码的稳定性, 不断地做代码精简与优化, 但异步时代的Swoole遗留下来的历史包袱积重难返, 制约了Swoole的进一步发展, 因此我们Swoole开发组决定面对这些历史问题, 做出一个大胆的决定, 从内核中剔除掉一些会导致协程生态混乱的模块, 只保留纯协程的编码模式, 直接提供PHP协程的最佳实践方案, 开发者无需再去纠结于各种复杂繁琐的配置, 甚至在同步, 异步和协程之中迷茫. Swoole后续的生态将完全建立在协程之上, 并且我们会基于5.0版本重新书写文档, 提供Swoole的最佳实践指南, 最大程度减小Swoole开发者的学习成本. **如果你的应用已经完全基于协程实现**(如你正在使用Swoft/EasySwoole3等纯协程框架/组件), 那么**5.0的改动不会对你造成多少影响**. 我将会在下方列出所有涉及删除或改动的内容, **以重要程度优先级排序**,...
场景:在协程环境使用,阻塞IO操作,提示不支持,这样小白用户都清楚,哪些函数不能使用,降低了小白用户门槛。否则,一个小白用户使用了阻塞IO操作,会阻塞worker进程,不能提前发现问题。
```php $client = new HttpClient(); var_dump($client->rawData); //下面这个方法可选 var_dump($client->totalLen); ``` 获取原始的响应报文,方便debug与流量统计。 实现的话,仅需在swoole_http_client.cc文件的 ```c++ bool http_client::recv_http_response(double timeout) ``` 方法中,进行属性赋值即可,然后再send 处进行重置归零