# 4.0.1 ## 主要更新 * 支持MySQL8全新的caching_sha2_password密码验证算法 * 增加enable_coroutine配置项,用于关闭自动创建协程 * 移除--enable-coroutine编译配置 * 修复chan->push无法立即唤醒等待协程的问题 ## 关闭内置协程 4.0.1之前的版本,底层在Server和Timer的事件回调函数中会自动创建协程,如果回调函数中没有使用任何协程API,这会浪费一次协程创建/销毁操作。而且无法与1.x保持兼容。 新版本中增加了enable_coroutine配置项,可关闭内置协程。用户可根据需要,在回调函数中自行使用Coroutine::create或go创建协程。关闭内置协程后,底层与1.x版本的行为保持了一致性,实现了100%兼容。原先使用1.x的框架,也可以直接基于4.0作为运行环境。 现在可以动态选择是否启用内置协程,那么--enable-coroutine编译配置变得可有可无了。新版本中移除了该编译选项。 ```php use Swoole\Http\Request; use Swoole\Http\Response; $http = new swoole_http_server('127.0.0.1', 9501); $http->set([ 'enable_coroutine' => false, // close build-in coroutine ]); $http->on('workerStart', function () { echo "Coroutine is " . (Co::getuid() > 0 ? 'enable' : 'disable')."\n"; }); $http->on("request", function (Request $request, Response $response) { $response->header("Content-Type", "text/plain"); if ($request->server['request_uri'] == '/co') { //关闭内置协程后,需要手工创建协程 go(function () use ($response) { $response->end("Hello Coroutine #" . Co::getuid()); }); } else { //没有任何协程操作,这里不存在额外的协程调度开销 $response->end("Hello Swoole #" . Co::getuid()); } }); $http->start(); ``` # 4.0.0 ## 全新协程内核 新版本4.0基于boost.context 1.60汇编代码实现了全新的协程内核。在保存PHP函数调用栈的基础上,增加了C栈的上下文存储。实现了对所有PHP语法的支持。现在在任意PHP的函数,包括call_user_func、反射、魔术方法、array_map中均可使用协程。 **4.0与2.0是100%兼容的,仅重构了协程内核,API层无变更** > 4.0分支代码升级至C++11标准,建议使用gcc-4.8或更高版本 > 仅支持php7.1及以上版本 ## 全局变量隔离 新版本中底层对全局变量进行了隔离,现在可以使用Swoole\Process创建多个Swoole\Server实例了。 ```php 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数据的问题 * 增加Channel->peek方法,用于窥视数据 * 修复Server->pause/resume在SWOOLE_PROCESS下无法使用的问题 * 移除Linux AIO,现在无论如何设置都使用线程池实现异步文件IO * 支持MySQL存储过程