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