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`类型客户端连接被拒绝时抛出的无效错误日志
';