Tianfeng.Han

Results 22 issues of Tianfeng.Han

按照Http的标准,Content-Type = x-www-form-urlencoded,表示POST的body是key=hello&key2=hello2的形式。 Yar里设置了 Content-Type = x-www-form-urlencoded,但POST的body并不是 x-www-form-urlencoded 内容。

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...

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...

参考: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...

草案

现状 ----- 目前`swoole`扩展底层仅提供驱动层能力,服务器端编程很多常用的功能并未提供,如连接池、`rpc`等,需要`php`代码实现。很多`swoole`框架都实现了对应的代码,产生了一定的重复工作。 **官方提供标准库,可以让大家协作共同制定一套标准的`library`,供`swoole`社区用户使用。减少重复性工作,提升代码复用性。** 参考对象`node.js`,`node`主干中维护了一个`lib`目录,提供使用`js`语言实现的标准库。 https://github.com/nodejs/node/tree/master/lib 改进 ---- * `swoole-src/lib`随`swoole.so`共同打包发布 * `make install`时自动将`lib`目录`copy`至与`${PHP_DIR}/lib/swoole`目录下 * `lib`目录根目录提供`autoload.php`,在`swoole`扩展加载时自动载入到`ZendVM`中 最终实现中,用户对`lib`提供的类或函数是无感知的,无法区分是扩展定义还是`lib`定义。保持足够的清理,仅依赖`swoole`不依赖其他任何`php`类库或`composer`包。 选项 ---- 提供`php.ini`配置`swoole.use_library = On/Off` 开启或关闭标准库 投票 ---- * 合并到标准库的`.php`代码,必须要得到框架开发者和社区用户的广泛认可

草案

有很多场景,我们希望不修改 PHP 代码就可以注入一些 Hook 函数到`Server`或`Client`中。使用`Hook`机制就可以支持这些功能。 > `Hook API`将加入`Runtime`模块。 API ==== ```php function Runtime::addHook(int $hook_type, callable $function, int $priority = false) : int; function Runtime::delHook(int $hook_id); ``` * `addHook`即可添加一个`Hook`,`$hook_type`指定在什么情况下执行,`$function`是回调的函数,成功设置返回`hook`的`$id` * `addHook`的第三个参数可以指定优先级,数值越大表示优先级越高,会先于优先级低的`Hook`执行,最大为`PHP_INT_MAX`...

草案

现状 ===== 由于`php`官方主流的`php-fpm`短生命周期存在很多限制,很多高级的用法在无法应用于`php`程序中。`swoole`支持常驻内存,应用程序可以使用更多高级的用法。 其中包管理`composer`的设计就是一个典型的例子。 碎片化 ---- `vendor`目录必须中均为单个`php`的文件,`java`语言中所有的包均为`jar`,虽然`php`也提供了`phar`打包机制,但使用的场景非常有限。`c/c++`程序采用的是 `*.so`或`*.dll`作为一个组件(包)。多个版本可以共存,如:`libswoole.so.4.2.13`、`libswoole.so.4.2.12`,应用程序可根据需要链接到不同的版本。 服务管理 ---- `composer`不支持服务管理功能,实际上普通的`php`程序也没有服务的概念,全部由`php-fpm`来是实现服务。而`swoole`启动的进程本身就是服务,应该自带服务管理的功能。`node.js`的`npm`就是一个很好的例子,`npm start` 就可以启动包内的服务。 SPM ====== 基于上述的原因,我们计划实现一个`swoole package manager`的程序。来提供更高级的包管理器能力。但由于`composer`几乎接近`php`的标准,生态非常完善。因此我们会完全兼容`composer`。 兼容 ---- * `spm`将`100%`兼容`composer`,基于`composer`进行二次开发。在保证`composer`所有功能可用的前提下,增加更多`swoole`特有的高级功能。可以直接将`spm`作为`composer`来使用 * `spm`将内置于`swoole boot`二进制包中,无需额外安装,可直接使用 * 在`composer.json`中的配置,使用`composer`基础模块来处理 * 在`package.json`中的配置,使用`spm`处理 >...

* Version: 0.1 * Date: 2017-12-11 * Author: Rango, [email protected] * Status: Draft 说明 --- `1.9.24`以前的版本中,进程模型是先由 Master 进程 Fork 出 Manager 进程,Manager 进程 Fork 出 Worker 和 Task 进程。在 Master...

## 目标 引入多线程运行模式,使 `Swoole` 实现多线程+协程的运行方式。 ## 背景 在 `Swoole` 服务器编程开发中,协程的出现已经解决了大部分难题,但是我们发现跨进程读写数据依然很难,需要借助进程间通信(`IPC`)、`Redis`、`Swoole\Table` 或其他共享内存实现。 `Redis`、`IPC` 进程间通信方式性能较差。而 `Swoole\Table` 的问题是需要固定分配内存,无法扩容,存在诸多限制。 除此之外,多进程的调试非常麻烦,例如我们要使用 `gdb` 就需要 `gdb -p` 逐个进程去追踪,而 `Java` 、`Golang` 这样的多线程模型,只有一个进程,调试更简单。实现一些底层的工具也会更容易。 ## 实现方式 - 基于`PHP` 的 `ZTS`...

草案

使用 `Github Action` 自动构建,并上传发布: 发布 ---- - [ ] `Github swoole-src releases` - [ ] `Gitee swoole-src releases` - [ ] `Github swoole-clireleases` - [ ] `Gitee swoole-cli releases` -...