Swoole 虽然在
2016
年就支持了协程特性, 但由于底层是基于 setjmp/longjmp 实现的 stackless 方案. 因此在某些场景下, 如 call_user_func,array_map,__destruct 中无法使用协程. 大型应用程序中逻辑非常复杂, 多人协作的团队中, 开发者很容易踩到坑. 在禁止场景中使用协程 API 会出现各种莫名其妙的问题发生. 限制了协程的应用范围.
新版本
4.0
基于 boost.context 1.60 汇编代码实现了全新的协程内核. 在保存 PHP 函数调用栈的基础上, 增加了 C 栈的上下文存储. 实现了对所有 PHP 语法的支持. 现在在任意 PHP 的函数, 包括 call_user_func, 反射, 魔术方法, array_map 中均可使用协程.
现在可以在 PHP 代码中任意位置使用协程, 开发者不再需要担心使用场景问题.
4.0
版本我们与 SwooleDistributed/Swoft/EasySwoole 等框架作者进行了紧密合作, 在大量项目中进行了灰度试用. 稳定性和健壮性均已达到工业级的水准. 完全可用于大型项目的生产环境中.
- go(function() { array_map("test",
- array("func start\n")); echo "co end\n";
- }); function test($p) {
- echo $p; co::sleep(1);
- echo "func end \n"; }
- 4.0
分支使用了 C++11 标准, 建议使用 gcc-4.8 或更高版本.
全局变量隔离
新版本中底层对全局变量进行了隔离, 现在可以使用 Swoole\Process 创建多个 Swoole\Server 实例了.
- for ($i = 0; $i < 2; $i++)
- {
- $p = new swoole_process(function () use ($i) {
- $port = 9501 + $i;
- $http = new swoole_http_server("127.0.0.1", $port);
- $http->on("start", function ($server) use ($port) {
- echo "Swoole http server is started at http://127.0.0.1:{$port}\n";
- });
- $http->on("request", function ($request, $response) {
- $response->header("Content-Type", "text/plain");
- $response->end("Hello World\n");
- });
- $http->start();
- }, false, false);
- $p->start();
- }
其他更新
修复 http2 服务器无法向 Chrome 浏览器客户端发送超过 16K 数据的问题
修复 BASE 模式下 Task 进程无法重启的问题
增加 Channel->peek 方法, 用于窥视数据
修复
Server->pause/resume
在 SWOOLE_PROCESS 下无法使用的问题
移除 Linux AIO, 现在无论如何设置都使用线程池实现异步文件 IO
支持 MySQL 存储过程
下载 4.0
GITHUB: https://github.com/swoole/swoole-src/releases/tag/v4.0.0
开源中国: https://gitee.com/swoole/swoole/tree/v4.0.0/
PECL: https://pecl.php.net/package/swoole/4.0.0
来源: https://juejin.im/entry/5b22461e5188257498649daf