社区文档编辑条例
最后更新于:2022-04-02 06:46:30
# 社区文档编辑条例
[TOC]
## 禁止
* 禁止发布与swoole开源项目无关的广告信息
* 禁止发布反动政治言论、色情、暴力等相关犯法内容
* 禁止发布无效的垃圾信息
## 必须
* 必须保持客观中立的态度,请勿提交带有个人情感倾向的内容
* 相关内容必须有可靠的信息来源和数据证明,请勿提交带有猜测、预估等不确定性的内容
## 版权
* 您贡献的文档内容版权将归于**Swoole开源项目**(swoole.com)
* 您的名称有权展示在文档的作者列表中
';
社区文档版权申明
最后更新于:2022-04-02 06:46:28
# 社区文档版权申明
1. 本网所有内容,包括所有文字、图片和音视频资料,版权均属**Swoole开源社区**(swoole.com)所有,任何媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布/发表。已经本网协议授权的媒体、网站,在下载使用时必须注明"稿件来源:Swoole开源社区",违者本网将依法追究责任。
2. 除注明"来源其他网站"的内容外,本网以下内容亦不可任意转载:
1. 本网所指向的非本网内容的相关链接内容;
2. 已作出不得转载或未经许可不得转载声明的内容;
3. 未由本网署名或本网引用、转载的他人作品等非本网版权内容;
4. 本网中特有的图形、标志、页面风格、编排方式、程序等;
5. 本网中必须具有特别授权或具有注册用户资格方可知晓的内容;
6. 其他法律不允许或本网认为不适合转载的内容。
3. 转载或引用本网内容必须是以新闻性或资料性公共免费信息为使用目的的合理、善意引用,不得对本网内容原意进行曲解、修改,同时必须保留本网注明的"稿件来源",并自负版权等法律责任。
4. 转载或引用本网内容不得进行如下活动:
1. 损害本网或他人利益;
2. 任何违法行为;
3. 任何可能破坏公秩良俗的行为;
4. 擅自同意他人继续转载、引用本网内容;
5. 转载或引用本网版权所有之内容须注明“转自(或引自)Swoole社区”字样,并标明本网网址[www.swoole.com](http://www.swoole.com/ "www.swoole.com")
6. 对于不当转载或引用本网内容而引起的民事纷争、行政处理或其他损失,本网不承担责任。
7. 对不遵守本声明或其他违法、恶意使用本网内容者,本网保留追究其法律责任的权利。
';
4.2.8
最后更新于:2022-04-02 06:46:25
# 4.2.8
[TOC]
### 增强
* 更好的 PHP协程栈和通道实现
* 协程GDB调试工具
### 修复
* MySQL 模块优化 ([#2124](https://github.com/swoole/swoole-src/pull/2124 "#2124"))
* Postgre 模块优化 ([#2069](https://github.com/swoole/swoole-src/pull/2069 "#2069"))
* 修复 MySQL客户端中使用存储过程的bug([#2117](https://github.com/swoole/swoole-src/issues/2117 "#2117"))
* 修复 HTTP客户端大文件上传的bug
* 修复`co::exec`wait process 的bug
* 协程嵌套检测
';
4.2.9
最后更新于:2022-04-02 06:46:23
# 4.2.9
[TOC]
### 增强
* 新增`Coroutine::defer`方法
### 修复
* 修复 max\_connection 不能超过 10000 的bug([#2134](https://github.com/swoole/swoole-src/issues/2134 "#2134"))
* 修复 Mysql客户端 执行`query CALL`查询后prepare 没清除buffer导致的错误([#2132](https://github.com/swoole/swoole-src/pull/2132 "#2132"))
* 修复 MAXOS`sendfile`的 EAGAIN bug([60023b7](https://github.com/swoole/swoole-src/commit/60023b786c591d1a99eb857f9bbf827431945a75 "60023b7"))
* 改善`onReceive/onPacket`的回调检查
* 使用 zend\_fcall\_info\_cache
* 删除 cidmap,cid将不会被再次重用
* 修复 socket construct failed core dump([02626d7](https://github.com/swoole/swoole-src/commit/02626d771643fa655f9c6cefbff049d5d23514ec "commit"))
* 修复 进程等待waitpid bug([38753b4](https://github.com/swoole/swoole-src/commit/38753b4300704c03cb5cc5add2731ebf18972c34 "38753b4"))
* 修复 swServer\_signal\_handler([#2145](https://github.com/swoole/swoole-src/issues/2145 "#2145"))
* 修复`Swoole\MsgQueue::destroy`的拼写错误([28e4cd4](https://github.com/swoole/swoole-src/commit/28e4cd4041b2e638bea4fc1cee81869210e089df "28e4cd4"))
* 修复 http2 header 太多导致的bug([5a1442a](https://github.com/swoole/swoole-src/commit/5a1442a56ff536182cfbd83db20ac256fd6ecb6f "5a1442a"))
* 修复 hiredis 错误消息缓冲区溢出([2149](https://github.com/swoole/swoole-src/issues/2149 "2149"))
';
4.2.7
最后更新于:2022-04-02 06:46:20
# 4.2.7
* Server添加`task_async`配置项,支持在纯同步模式和异步模式之间切换,默认为同步模式(向后兼容)
* `Runtime::enableCoroutine`增加了`gethostbyname`的底层协程化
* 支持`PHP7.3RC5`版本
* 修复低版本GCC的兼容问题([#2094](https://github.com/swoole/swoole-src/issues/2094 "#2094"))
* 修复`client->recv`ssl超时错误
* 修复`Socks5`代理不起作用的问题([#2103](https://github.com/swoole/swoole-src/issues/2103 "#2103"))
* 修复redis请求失败后`connected`属性未更新的错误Co\\Redis。([#2104](https://github.com/swoole/swoole-src/issues/2104 "#2104"))
* 修复`taskWait`段错误([#2098](https://github.com/swoole/swoole-src/issues/2098 "#2098"))
* 修复`Co\Socket`重用问题
* 修复了`Process\Pool`中一个bug
* `Swoole\Serialize`将被迫在PHP7.3中关闭(暂时不支持)
';
4.2.6
最后更新于:2022-04-02 06:46:18
# 4.2.6
* 内置`hiredis`依赖, 无需单独编译, 重构`Co\Redis`, 更加稳定
* 完善Alpine系统的编译测试
* 重构`Co::exec`, 修复其在一些场景下的执行和输出问题
* 修复协程切换在多层嵌套且多次挂起场景下的错误
* 重构协程的文件相关函数
* 修复双端同时关闭时可能产生的连接泄露
* 修复`channel`在阻塞场景下出现的bug
* 修复`mysql->prepare`返回true (#2080)
* 修复`swoole_table`以数组方式操作产生的引用计数问题 (#2079)
* 修复`ssl_host_name`无法开启SNI (#2085)
* 修复MacOS下`kqueue`纳秒转换问题 (#2087)
* 修复所有`swoole_object`野指针
* 添加一系列底层开发的脚本工具
';
4.2.5
最后更新于:2022-04-02 06:46:16
# 4.2.5
* Alpine系统支持 (#2071)
* 修复 task\_ipc\_mode 的问题 (#2072)
* 优化client代理配置
* 修复SSL的潜在问题 (#2053)
';
4.2.4
最后更新于:2022-04-02 06:46:13
# 4.2.4
* 增加全面的协程绑定检测和友好的错误提示
* Runtime stream hook 增加error\_text支持
* 重构HTTP2客户端, 修复断线重连问题, 修复cookie问题
* 增加异步redis回调函数类型检测
* 修复http客户端使用下载API后无法执行其它请求
* 修复`swoole_http_response->detach`跨函数内存错误
* 修复在协程化后PDO连接异常断开问题
* 明确参数解析错误统一返回FALSE(而不是null)
* 修复协程切换后异常丢失问题
* 修复`task_max_request`不生效问题
* 优化mysql响应包完整性检测
* 修复flock死锁问题
* 修复底层swoole\_buffer没有释放object的错误
* 修复多个`Content-Length`头造成的BUG
* 增强底层zval类型检测, 防御性编程
* 修复HTTP协程客户端setData使用对象(stream)的bug, 重构HTTP协程的属性处理
* openssl错误清理优化
* `co::fread`优化兼容fseek和非普通文件读取
* swoole\_server TCP和UDP模式分离
* 修复创建server时传入非法参数导致的问题
* 修复在BASE模式下`addProcess`产生的错误
* 修复task进程使用`reload_async`(异步安全重启特性)的问题
* 增加`package_eof`非法空字符串检测
* 移除弃用的多线程模式的代码
';
4.2.3
最后更新于:2022-04-02 06:46:11
# 4.2.3
这个版本主要基于`4.2.2`做了一些修复
* 添加`Co::statvfs`以检索文件系统信息
* 修复了`swoole_http_response`对象上的非数组属性错误
* 修复了错误的版本号,添加了自动修复工具
';
4.2.2
最后更新于:2022-04-02 06:46:09
# 4.2.2
* task进程支持异步协程
* 重构`addListener`, 现在可以以任意顺序添加新的服务监听
* 支持同时混合启用`http`,`http2`,`websocket`,`tcp`服务
* 补全协程redis客户端方法参数定义
* `Co::readFile`支持读取非磁盘文件
* static\_handler支持更多的文件类型和跳过长度为0的文件
* 修复multipart/formdata 在某些情况下解析错误的bug
* 修复MacOS下sendfile数据错乱
* 修复SIGRTMIN处理错误导致日志文件无法重新打开的bug
* 修复redis-client上次错误值未清除导致下一次请求出现错误结果的bug
* 修复尝试连接已连接的异步redis发生coredump的bug
* 修复MySQL客户端协议处理参数绑定NULL的bug
* 修复filehook引发的段错误, 关闭了include/require的协程化
* 修复socket hook中socket构造失败产生coredump的bug
* 修复sleep hook在时间为极小值时产生的coredump
* 修复读取被unset的对象属性时返回非法指针的bug
* alpine依赖兼容性优化
* cygwin兼容性优化
* 识别204响应跳过body处理
* 底层代码大清理, 删除所有TSRM宏, PHP5兼容宏与函数, 减少无用的栈分配和多重指针, 重新开启FASTZPP提高参数解析性能
* 错误优化, swoole底层出现问题时将会产生一个包含版本号的错误反馈提示
* 兼容PHP70中event\_wait结束后EG(scope)未还原导致无法访问私有属性
* 支持log\_level屏蔽warning信息
';
4.2.1
最后更新于:2022-04-02 06:46:07
# 4.2.1
* 此版本是基于上个版本做出了一些错误修复
* 修复某些环境下没有time\_nanosleep导致的编译失败
* 修复PHP-ZTS下的载入错误
* 修复dispatch模式为7时使用协程出现Bad file descriptor的错误
* 修复协程exit拦截器不生效
* 修复过长域名解析缓冲区不足导致coredump
';
4.1.2
最后更新于:2022-04-02 06:46:04
# 4.1.2
* 增加`socket_hook`
* 修复嵌套协程的BUG
* 修复协程中退出时传入变量引用计数问题
* 协程MySQL`query`,`prepare`,`execute`默认不超时, 符合文档API描述
* 协程MySQL事务操作禁止使用defer模式, 需开发者明确用途, 并发开启事务可用`query`代替
* 修复mmap`MAP_FAILED`返回值检测的问题
* 增加PECL打包检测
';
4.1.1
最后更新于:2022-04-02 06:46:02
# 4.1.1
* 仅修复了PECL打包缺失文件编译失败的问题
';
4.0.4
最后更新于:2022-04-02 06:46:00
# 4.0.4
[TOC]
* 修复了在SWOOLE\_PROCESS极端情况下的一个[内核级别错误](https://github.com/swoole/swoole-src/issues/1864)
* 修复`WebSocket`协程客户端接收超时关闭连接的问题
* 修复`PHP`类继承扩展内置类未调用`parent::__construct`导致出现`crash`的问题
* 底层禁止用户手动调用所有swoole类的析构`__destruct`方法, 避免`crash`
* 修复上传过长文件名导致的`crash`
* 完全修复编译时`HAVE_SOCKETS`不存在问题, 包括静态编译
* 修复协程`suspend`和`resume`断言错误
* `taskwait`支持协程调度,在协程内调用`taskwait`不会阻塞
* 更完善的`HTTP2协议`支持, 可用于构建任意`Grpc客户端`
* [Http2客户端的相关不兼容改动](https://wiki.swoole.com/wiki/page/964.html)
* 完善`MacOS`下的`Signal`处理
### 底层相关
* 删除所有无用的PHP5兼容性代码, 大量精简了代码
* 部署了完善的travis-ci自动化测试, 确保每一次提交都准确无误
* 删除无用的timefd代码
';
4.0.2
最后更新于:2022-04-02 06:45:57
# 4.0.2
* 支持在协程中使用ob\_\*系列函数, 每个协程拥有独立的output控制器
* 底层更好的Channel实现(用户层无感知)
* 修复所有已知的关于Client的bug, 如下:
* 在复杂场景下`client->fd`断言错误
* 丢失的client对象属性定义
* defer模式下并发请求后, 客户端无法复用的bug
* 在客户端因极小timeout关闭后DNS查询回调仍被触发的bug
* HTTP1.1版本的client遭遇服务器尝试升级HTTP2时无法解析数据的bug
* 在新的请求发起时, 清除所有上一次响应的属性(如`headers`,`body`等)
* 清除了所有PHP73版本下的编译警告
';
4.0.3
最后更新于:2022-04-02 06:45:55
# 4.0.3
[TOC]
## 主要更新
### channel
* 修复`channel`高并发时`coredump`的问题
* 增加`channel->pop($timeout)`超时机制,默认永不超时
* 移除`channel->select`
### co/client
* 修复主动调用`close`方法时导致的内存错误
### co/http2/client
* 增加`recv`的超时机制
* 增加`http2-client`对cookie解析的完整支持
* 修复`http2-client`数组属性被置为非null非数组时的coredump
* 修复`http2-client`的内存泄露和错误
* 修复`send`后长时间未`recv`导致的coredump
* 增加窗口流量控制(无限制), 解决数据超过默认窗口大小时死锁的问题
';
历史:版本更新记录(4.x)
最后更新于:2022-04-02 06:45:53
# 历史:版本更新记录(4.x)
';
3.0.0
最后更新于:2022-04-02 06:45:50
# 3.0.0
[TOC]
## 新版协程
在最新的`3.0`版本中,我们实现了一个全新的`PHP`内置协程调度器,基于`ZendVM`的`EG(vm_interrupt)`机制实现,移除了`setjmp/longjmp`的依赖。使得`Swoole`协程可以应用于任何位置,包括`PHP`对象析构函数、魔术方法、反射函数调用 等场景,新的版本号将更改为`Swoole 3.0`,原计划基于`libco`的`C`栈协程,推迟到`4.0`。
新版协程内核依赖`PHP-7.1`,因此`Swoole`对`PHP`的版本依赖提高至`7.1`,对`gcc`的版本依赖提高至`4.8`。
~~~
3.0 分支已废弃,请勿使用
~~~
## Socket 模块
`3.0`版本提供了一个更底层`Co\Socket`模块,封装了操作系统`socket`相关`API`。某些情况下`Server`和`Client`无法满足需求,这时可以使用`Co\Socket`自行实现`Server`和`Client`功能。
#### Server 端
~~~
$socket = new Co\Socket(AF_INET, SOCK_STREAM, 0);
$socket->bind('127.0.0.1', 9601);
$socket->listen(128);
go(function () use ($socket) {
while(true) {
echo "Accept: \n";
$client = $socket->accept();
echo "New Coroutine: \n";
go(function () use ($client) {
while(true) {
echo "Client Recv: \n";
$data = $client->recv();
if (empty($data)) {
$client->close();
break;
}
var_dump($client->getsockname());
var_dump($client->getpeername());
echo "Client Send: \n";
$client->send("Server: $data");
}
});
}
});
~~~
#### Client 端
~~~
$socket = new Co\Socket(AF_INET, SOCK_STREAM, 0);
go(function () use ($socket) {
$retval = $socket->connect('localhost', 9601);
while ($retval)
{
$n = $socket->send("hello");
var_dump($n);
$data = $socket->recv();
var_dump($data);
if (empty($data)) {
$socket->close();
break;
}
co::sleep(1.0);
}
var_dump($retval, $socket->errCode);
});
~~~
## 支持 C/C++ 混合开发
从`3.0`版本开始,我们使用了`C++`作为主要的开发语言。新增的模块基于`C++ 11`进行开发。以降低开发成本,提升效率。
编译`3.0`版本,需要`gcc-4.8`或更高版本。另外,`3.0`还引入了`PHP-X`,某些模块将会基于`PHP-X`进行开发。
## 其他更新
* 增加`Http\Response->detach`和`Http\Response::create`方法
* 增加`Http\Response->redirect`方法
* 增加`Runtime::enableStrictMode`方法,可禁用`PHP`提供的同步阻塞函数和类
* 修复`Co\Redis`连接失败时发生内存泄漏的问题
* 修复`SOCK_DGRAM`类型客户端连接被拒绝时抛出的无效错误日志
';
2.2.0
最后更新于:2022-04-02 06:45:48
# 2.2.0
* 修复`Co\Redis`连接失败时发生内存泄漏的问题
* 修复`SOCK_DGRAM`类型客户端连接被拒绝时抛出的无效错误日志
';
2.1.2
最后更新于:2022-04-02 06:45:46
# 2.1.2
* 添加 PostgreSQL coroutine client (depends on libpg)
* 添加 Co::readFile
* 添加 Co::writeFile
* 添加 swoole\_process\_pool
* 添加 swoole\_msgqueue
';