首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
Swoole v4.6.0 版本发布,支持原生 curl 协程客户端
Swoole `v4.6.0` 版本发布了,同样也是 2021 年的首个版本更新。 作为一个 y 版本发布,此次更新也包含了不兼容的修改以及许多的新功能,下面就来看一看都有哪些改动? ## 向下不兼容改动 1. 从 `v4.6.0` 版本开始将不再支持 `PHP7.1` PHP 官方对于 `PHP7.1` 的支持也早已在 2019 年底结束。 2. 将 `Event::rshutdown()` 标记为已弃用,请改用 `Coroutine\run` 在之前的版本中,如果在`index.php`中直接使用`go`创建协程 ```php go(function () { var_dump(Co\System::gethostbyname('www.baidu.com')); }); ``` 这样是正常的,但是在此版本中,就会收到废弃警告 ```bash PHP Deprecated: Swoole\Event::rshutdown(): Event::wait() in shutdown function is deprecated in Unknown on line 0 ``` 推荐使用`Coroutine\run`来代替这种方式: ```php Swoole\Coroutine\run(function () { var_dump(Co\System::gethostbyname('www.baidu.com')); }); Swoole\Coroutine\run(function () { go(function () { var_dump(Co\System::gethostbyname('www.baidu.com')); }); go(function () { var_dump(Co\System::gethostbyname('www.zhihu.com')); }); }); ``` 3. 默认启用 `Coroutine` hook 使用了上面所说的`Coroutine\run`之后,也会迎来一个新的变更:默认启用 `Coroutine` hook,即自动设置`SWOOLE_HOOK_ALL` ```php use Swoole\Runtime; Swoole\Coroutine\run(function () { $flags = Runtime::getHookFlags(); assert($flags === SWOOLE_HOOK_ALL); var_dump($flags); }); ``` 当然也可以自行设置所需要的 `flag` ```php use Swoole\Runtime; Runtime::setHookFlags(SWOOLE_HOOK_TCP); Swoole\Coroutine\run(function () { $flags = Runtime::getHookFlags(); assert($flags === SWOOLE_HOOK_TCP); var_dump($flags); }); ``` 4. 使用协程时禁用不安全功能,包括 `pcntl_fork`/`pcntl_wait`/`pcntl_waitpid`/`pcntl_sigtimedwait` ```php Swoole\Coroutine\run(function () { $pid = pcntl_fork(); var_dump($pid); }); ``` 在此版本使用上面的示例代码,你将会得到一个 `Warning` 错误 ```bash PHP Warning: pcntl_fork() has been disabled for security reasons ``` 5. 移除了 `session_id` 的最大限制,不再重复 将 Server 的 `session_id` 从 `int24` 改为了 `int64` ,这样可以持续自增,永不重复。 之前的`int24`时,`session_id`大约可以到 1600 万就可能会出现重复的问题。 ## 新增 API & 增强 ### 原生 curl 协程客户端 (SWOOLE_HOOK_NATIVE_CURL) 在这个版本中最大的变化莫过于支持了原生 `curl` 协程客户端,有什么用呢? 用过 `SWOOLE_HOOK_CURL` 的小伙伴应该知道,有一些不支持的选项,同时还会因为部分 SDK 的不兼容导致一些错误,例如: ```bash PHP Notice: Object of class Swoole\Curl\Handler could not be converted to int PHP Warning: curl_multi_add_handle() expects parameter 2 to be resource, object given ``` 原因是 hook 后的 `curl` 不再是一个 `resource` 类型,而是 `object` 类型。 > 出现这种问题也建议联系 SDK 方修改代码,因为在 `PHP8` 中 `curl` 不再是 `resource` 类型,而是 `object` 类型 以及经常使用的阿里云 OSS SDK 也是不支持`SWOOLE_HOOK_CURL`的,会遇到一些奇奇怪怪的 那么从 `v4.6.0` 版本开始就可以使用 `SWOOLE_HOOK_NATIVE_CURL` 代替 `SWOOLE_HOOK_CURL`,来解决以上提到的问题 使用`SWOOLE_HOOK_NATIVE_CURL`需要在编译 Swoole 扩展时增加 [--enable-swoole-curl](https://wiki.swoole.com/#/environment?id=%e9%80%9a%e7%94%a8%e5%8f%82%e6%95%b0) 编译参数,开启该选项后将自动设置 `SWOOLE_HOOK_NATIVE_CURL`,关闭 `SWOOLE_HOOK_CURL`,同时 `SWOOLE_HOOK_ALL` 也会包含 `SWOOLE_HOOK_NATIVE_CURL` > pecl 的 v4.6.0 版本暂时没有增加这个选项,请使用手动编译开启,下个版本中会增加。 编译成功后使用`--ri`查看信息,就可以看到`curl-native` ```bash $ php --ri swoole | grep curl curl-native => enabled ``` 从下面的例子就可以看出两者的不同 ```php Swoole\Runtime::setHookFlags(SWOOLE_HOOK_CURL); Swoole\Coroutine\run(function () { $curl = curl_init(); var_dump(get_class($curl), (int) $curl); //PHP Notice: Object of class Swoole\Curl\Handler could not be converted to int //string(19) "Swoole\Curl\Handler" //int(1) }); ``` ```php Swoole\Coroutine\run(function () { $curl = curl_init(); var_dump($curl, (int) $curl); //resource(4) of type (Swoole-Coroutine-cURL Handle) //int(4) }); ``` ### SWOOLE_HOOK_SOCKETS 增加了对 ext-sockets 的协程化支持 ```php const N = 8; $GLOBALS['time'] = []; $s = microtime(true); Swoole\Runtime::setHookFlags(SWOOLE_HOOK_SOCKETS); Swoole\Coroutine\run(function () { $n = N; while($n--) { go(function() { $s = microtime(true); $domain = 'www.baidu.com'; $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($sock, $domain, 80); socket_write($sock, "GET / HTTP/1.0\r\nHost: $domain\r\nConnection: close\r\nKeep-Alive: off\r\n\r\n"); $html = ''; while(true) { $data = socket_read($sock, 8192); if ($data == '') { break; } $html .= $data; } socket_close($sock); $GLOBALS['time'][] = microtime(true) - $s; }); } }); echo "Done\n"; var_dump(microtime(true) - $s, array_sum($GLOBALS['time']) / 3); ``` ### 支持 Server 事件回调函数传递对象风格的参数 默认不启用。通过设置 [event_object](https://wiki.swoole.com/#/server/setting?id=event_object) 参数进行启用,以下事件回调将使用对象风格 - [onConnect](https://wiki.swoole.com/#/server/events?id=onconnect) - [onReceive](https://wiki.swoole.com/#/server/events?id=onreceive) - [onClose](https://wiki.swoole.com/#/server/events?id=onclose) - [onPacket](https://wiki.swoole.com/#/server/events?id=onpacket) - [onPipeMessage](https://wiki.swoole.com/#/server/events?id=onpipemessage) - [onWorkerError](https://wiki.swoole.com/#/server/events?id=onworkererror) - [onTask](https://wiki.swoole.com/#/server/events?id=ontask) - [onFinish](https://wiki.swoole.com/#/server/events?id=onfinish) 以 `onConnect` 为例,具体内容可参考文档 [回调对象](https://wiki.swoole.com/#/server/events?id=%e5%9b%9e%e8%b0%83%e5%af%b9%e8%b1%a1) ```php $server->on('Connect', function (Swoole\Server $server, int $fd, int $reactorId) { var_dump($fd); }); $server->set([ 'event_object' => true, ]); $server->on('Connect', function (Swoole\Server $serv, Swoole\Server\Event $object) { var_dump($object); }); ``` ### 支持重复 header 支持重复设置相同 `$key` 的 HTTP 头,并且 `$value` 支持多种类型,如 `array`、`object`、`int`、`float`,底层会进行 `toString` 转换,并且会移除末尾的空格以及换行 ```php $http = new Swoole\Http\Server('0.0.0.0', 9501); $http->on('request', function ($request, $response) { $response->header('Test-Value', [ "a\r\n", 'd5678', "e \n ", null, 5678, 3.1415926, ]); $response->header('Foo', new SplFileInfo('bar')); }); $http->start(); ``` ```bash $ curl -I http://127.0.0.1:9501 HTTP/1.1 200 OK Test-Value: a Test-Value: d5678 Test-Value: e Test-Value: 5678 Test-Value: 3.1415926 Foo: bar Server: swoole-http-server Connection: keep-alive Content-Type: text/html Date: Wed, 06 Jan 2021 05:16:17 GMT Content-Length: 39 ``` ### 协程死锁检测 默认开启,可以通过在 [Coroutine::set](https://wiki.swoole.com/#/coroutine/coroutine?id=set) 中设置 `enable_deadlock_check` 进行关闭 在 [EventLoop](https://wiki.swoole.com/#/learn?id=%e4%bb%80%e4%b9%88%e6%98%afeventloop) 终止后,如果存在协程死锁,底层会输出相关堆栈信息: ```bash =================================================================== [FATAL ERROR]: all coroutines (count: 1) are asleep - deadlock! =================================================================== [Coroutine-2] -------------------------------------------------------------------- #0 Swoole\Coroutine::printBackTrace() called at [@swoole-src/library/core/Coroutine/functions.php:74] #1 Swoole\Coroutine\deadlock_check() #2 curl_getinfo() called at [/mnt/c/code/php/hyperf-skeleton/vendor/aliyuncs/oss-sdk-php/src/OSS/Http/RequestCore.php:492] ``` ## 更新日志 下面是完整的更新日志 ### 向下不兼容改动 - 移除了`session id`的最大限制,不再重复 (#3879) (@matyhtf) - 使用协程时禁用不安全功能,包括`pcntl_fork`/`pcntl_wait`/`pcntl_waitpid`/`pcntl_sigtimedwait` (#3880) (@matyhtf) - 默认启用 coroutine hook (#3903) (@matyhtf) ### 移除 - 不再支持 PHP7.1 (4a963df) (9de8d9e) (@matyhtf) ### 废弃 - 将 `Event::rshutdown()` 标记为已弃用,请改用 Coroutine\run (#3881) (@matyhtf) ### 新增 API - 支持 setPriority/getPriority (#3876) (@matyhtf) - 支持 native-curl hook (#3863) (@matyhtf) (@huanghantao) - 支持 Server 事件回调函数传递对象风格的参数,默认不传递对象风格的参数 (#3888) (@matyhtf) - 支持 hook sockets 扩展 (#3898) (@matyhtf) - 支持重复 header (#3905) (@matyhtf) - 支持 SSL sni (#3908) (@matyhtf) - 支持 hook stdio (#3924) (@matyhtf) - 支持 stream_socket 的 capture_peer_cert 选项 (#3930) (@matyhtf) - 添加 Http\Request::create/parse/isCompleted (#3938) (@matyhtf) - 添加 Http\Response::isWritable (db56827) (@matyhtf) ### 增强 - Server 的所有时间精度都从 int 修改为 double (#3882) (@matyhtf) - 在 swoole_client_select 函数里面检查 poll 函数的 EINTR 情况 (#3909) (@shiguangqi) - 添加协程死锁检测 (#3911) (@matyhtf) - 支持使用 SWOOLE_BASE 模式在另一个进程中关闭连接 (#3916) (@matyhtf) - 优化 Server master 进程与 worker 进程通信的性能,减少内存拷贝 (#3910) (@huanghantao) (@matyhtf) ### 修复 - 当 Coroutine\Channel 被关闭时,pop 出里面所有的数据 (960431d) (@matyhtf) - 修复使用 JIT 时的内存错误 (#3907) (@twose) - 修复 `port->set()` dtls 编译错误 (#3947) (@Yurunsoft) - 修复 connection_list 错误 (#3948) (@sy-records) - 修复 ssl verify (#3954) (@matyhtf) - 修复 Table 递增和递减时不能清除所有列问题 (#3956) (@matyhtf) (@sy-records) - 修复使用 LibreSSL 2.7.5 编译失败 (#3962) (@matyhtf) - 修复未定义的常量 CURLOPT_HEADEROPT 和 CURLOPT_PROXYHEADER (swoole/library#77) ([@sy-records](https://github.com/sy-records)) ### 内核 - 默认情况下忽略 SIGPIPE 信号 (9647678) (@matyhtf) - 支持同时运行 PHP 协程和 C 协程 (c94bfd8) (@matyhtf) - 添加 get_elapsed 测试 (#3961) (@luolaifa000) - 添加 get_init_msec 测试 (#3964) (@luffluo) ![](https://cdn.jsdelivr.net/gh/sy-records/staticfile/images/swoole/wechat.png)
发布于3年前 · 41 次浏览 · 来自
公告
鲁飞
Swoole `v4.6.0` 版本发布了,同样也是 2021 年的首个版本更新。 作为一个 y 版本发布,此次更新也包含了不兼容的修改以及许多的新功能,下面就来看一看都有哪些改动? ## 向下不兼容改动 1. 从 `v4.6.0` 版本开始将不再支持 `PHP7.1` PHP 官方对于 `PHP7.1` 的支持也早已在 2019 年底结束。 2. 将 `Event::rshutdown()` 标记为已弃用,请改用 `Coroutine\run` 在之前的版本中,如果在`index.php`中直接使用`go`创建协程 ```php go(function () { var_dump(Co\System::gethostbyname('www.baidu.com')); }); ``` 这样是正常的,但是在此版本中,就会收到废弃警告 ```bash PHP Deprecated: Swoole\Event::rshutdown(): Event::wait() in shutdown function is deprecated in Unknown on line 0 ``` 推荐使用`Coroutine\run`来代替这种方式: ```php Swoole\Coroutine\run(function () { var_dump(Co\System::gethostbyname('www.baidu.com')); }); Swoole\Coroutine\run(function () { go(function () { var_dump(Co\System::gethostbyname('www.baidu.com')); }); go(function () { var_dump(Co\System::gethostbyname('www.zhihu.com')); }); }); ``` 3. 默认启用 `Coroutine` hook 使用了上面所说的`Coroutine\run`之后,也会迎来一个新的变更:默认启用 `Coroutine` hook,即自动设置`SWOOLE_HOOK_ALL` ```php use Swoole\Runtime; Swoole\Coroutine\run(function () { $flags = Runtime::getHookFlags(); assert($flags === SWOOLE_HOOK_ALL); var_dump($flags); }); ``` 当然也可以自行设置所需要的 `flag` ```php use Swoole\Runtime; Runtime::setHookFlags(SWOOLE_HOOK_TCP); Swoole\Coroutine\run(function () { $flags = Runtime::getHookFlags(); assert($flags === SWOOLE_HOOK_TCP); var_dump($flags); }); ``` 4. 使用协程时禁用不安全功能,包括 `pcntl_fork`/`pcntl_wait`/`pcntl_waitpid`/`pcntl_sigtimedwait` ```php Swoole\Coroutine\run(function () { $pid = pcntl_fork(); var_dump($pid); }); ``` 在此版本使用上面的示例代码,你将会得到一个 `Warning` 错误 ```bash PHP Warning: pcntl_fork() has been disabled for security reasons ``` 5. 移除了 `session_id` 的最大限制,不再重复 将 Server 的 `session_id` 从 `int24` 改为了 `int64` ,这样可以持续自增,永不重复。 之前的`int24`时,`session_id`大约可以到 1600 万就可能会出现重复的问题。 ## 新增 API & 增强 ### 原生 curl 协程客户端 (SWOOLE_HOOK_NATIVE_CURL) 在这个版本中最大的变化莫过于支持了原生 `curl` 协程客户端,有什么用呢? 用过 `SWOOLE_HOOK_CURL` 的小伙伴应该知道,有一些不支持的选项,同时还会因为部分 SDK 的不兼容导致一些错误,例如: ```bash PHP Notice: Object of class Swoole\Curl\Handler could not be converted to int PHP Warning: curl_multi_add_handle() expects parameter 2 to be resource, object given ``` 原因是 hook 后的 `curl` 不再是一个 `resource` 类型,而是 `object` 类型。 > 出现这种问题也建议联系 SDK 方修改代码,因为在 `PHP8` 中 `curl` 不再是 `resource` 类型,而是 `object` 类型 以及经常使用的阿里云 OSS SDK 也是不支持`SWOOLE_HOOK_CURL`的,会遇到一些奇奇怪怪的 那么从 `v4.6.0` 版本开始就可以使用 `SWOOLE_HOOK_NATIVE_CURL` 代替 `SWOOLE_HOOK_CURL`,来解决以上提到的问题 使用`SWOOLE_HOOK_NATIVE_CURL`需要在编译 Swoole 扩展时增加 [--enable-swoole-curl](https://wiki.swoole.com/#/environment?id=%e9%80%9a%e7%94%a8%e5%8f%82%e6%95%b0) 编译参数,开启该选项后将自动设置 `SWOOLE_HOOK_NATIVE_CURL`,关闭 `SWOOLE_HOOK_CURL`,同时 `SWOOLE_HOOK_ALL` 也会包含 `SWOOLE_HOOK_NATIVE_CURL` > pecl 的 v4.6.0 版本暂时没有增加这个选项,请使用手动编译开启,下个版本中会增加。 编译成功后使用`--ri`查看信息,就可以看到`curl-native` ```bash $ php --ri swoole | grep curl curl-native => enabled ``` 从下面的例子就可以看出两者的不同 ```php Swoole\Runtime::setHookFlags(SWOOLE_HOOK_CURL); Swoole\Coroutine\run(function () { $curl = curl_init(); var_dump(get_class($curl), (int) $curl); //PHP Notice: Object of class Swoole\Curl\Handler could not be converted to int //string(19) "Swoole\Curl\Handler" //int(1) }); ``` ```php Swoole\Coroutine\run(function () { $curl = curl_init(); var_dump($curl, (int) $curl); //resource(4) of type (Swoole-Coroutine-cURL Handle) //int(4) }); ``` ### SWOOLE_HOOK_SOCKETS 增加了对 ext-sockets 的协程化支持 ```php const N = 8; $GLOBALS['time'] = []; $s = microtime(true); Swoole\Runtime::setHookFlags(SWOOLE_HOOK_SOCKETS); Swoole\Coroutine\run(function () { $n = N; while($n--) { go(function() { $s = microtime(true); $domain = 'www.baidu.com'; $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($sock, $domain, 80); socket_write($sock, "GET / HTTP/1.0\r\nHost: $domain\r\nConnection: close\r\nKeep-Alive: off\r\n\r\n"); $html = ''; while(true) { $data = socket_read($sock, 8192); if ($data == '') { break; } $html .= $data; } socket_close($sock); $GLOBALS['time'][] = microtime(true) - $s; }); } }); echo "Done\n"; var_dump(microtime(true) - $s, array_sum($GLOBALS['time']) / 3); ``` ### 支持 Server 事件回调函数传递对象风格的参数 默认不启用。通过设置 [event_object](https://wiki.swoole.com/#/server/setting?id=event_object) 参数进行启用,以下事件回调将使用对象风格 - [onConnect](https://wiki.swoole.com/#/server/events?id=onconnect) - [onReceive](https://wiki.swoole.com/#/server/events?id=onreceive) - [onClose](https://wiki.swoole.com/#/server/events?id=onclose) - [onPacket](https://wiki.swoole.com/#/server/events?id=onpacket) - [onPipeMessage](https://wiki.swoole.com/#/server/events?id=onpipemessage) - [onWorkerError](https://wiki.swoole.com/#/server/events?id=onworkererror) - [onTask](https://wiki.swoole.com/#/server/events?id=ontask) - [onFinish](https://wiki.swoole.com/#/server/events?id=onfinish) 以 `onConnect` 为例,具体内容可参考文档 [回调对象](https://wiki.swoole.com/#/server/events?id=%e5%9b%9e%e8%b0%83%e5%af%b9%e8%b1%a1) ```php $server->on('Connect', function (Swoole\Server $server, int $fd, int $reactorId) { var_dump($fd); }); $server->set([ 'event_object' => true, ]); $server->on('Connect', function (Swoole\Server $serv, Swoole\Server\Event $object) { var_dump($object); }); ``` ### 支持重复 header 支持重复设置相同 `$key` 的 HTTP 头,并且 `$value` 支持多种类型,如 `array`、`object`、`int`、`float`,底层会进行 `toString` 转换,并且会移除末尾的空格以及换行 ```php $http = new Swoole\Http\Server('0.0.0.0', 9501); $http->on('request', function ($request, $response) { $response->header('Test-Value', [ "a\r\n", 'd5678', "e \n ", null, 5678, 3.1415926, ]); $response->header('Foo', new SplFileInfo('bar')); }); $http->start(); ``` ```bash $ curl -I http://127.0.0.1:9501 HTTP/1.1 200 OK Test-Value: a Test-Value: d5678 Test-Value: e Test-Value: 5678 Test-Value: 3.1415926 Foo: bar Server: swoole-http-server Connection: keep-alive Content-Type: text/html Date: Wed, 06 Jan 2021 05:16:17 GMT Content-Length: 39 ``` ### 协程死锁检测 默认开启,可以通过在 [Coroutine::set](https://wiki.swoole.com/#/coroutine/coroutine?id=set) 中设置 `enable_deadlock_check` 进行关闭 在 [EventLoop](https://wiki.swoole.com/#/learn?id=%e4%bb%80%e4%b9%88%e6%98%afeventloop) 终止后,如果存在协程死锁,底层会输出相关堆栈信息: ```bash =================================================================== [FATAL ERROR]: all coroutines (count: 1) are asleep - deadlock! =================================================================== [Coroutine-2] -------------------------------------------------------------------- #0 Swoole\Coroutine::printBackTrace() called at [@swoole-src/library/core/Coroutine/functions.php:74] #1 Swoole\Coroutine\deadlock_check() #2 curl_getinfo() called at [/mnt/c/code/php/hyperf-skeleton/vendor/aliyuncs/oss-sdk-php/src/OSS/Http/RequestCore.php:492] ``` ## 更新日志 下面是完整的更新日志 ### 向下不兼容改动 - 移除了`session id`的最大限制,不再重复 (#3879) (@matyhtf) - 使用协程时禁用不安全功能,包括`pcntl_fork`/`pcntl_wait`/`pcntl_waitpid`/`pcntl_sigtimedwait` (#3880) (@matyhtf) - 默认启用 coroutine hook (#3903) (@matyhtf) ### 移除 - 不再支持 PHP7.1 (4a963df) (9de8d9e) (@matyhtf) ### 废弃 - 将 `Event::rshutdown()` 标记为已弃用,请改用 Coroutine\run (#3881) (@matyhtf) ### 新增 API - 支持 setPriority/getPriority (#3876) (@matyhtf) - 支持 native-curl hook (#3863) (@matyhtf) (@huanghantao) - 支持 Server 事件回调函数传递对象风格的参数,默认不传递对象风格的参数 (#3888) (@matyhtf) - 支持 hook sockets 扩展 (#3898) (@matyhtf) - 支持重复 header (#3905) (@matyhtf) - 支持 SSL sni (#3908) (@matyhtf) - 支持 hook stdio (#3924) (@matyhtf) - 支持 stream_socket 的 capture_peer_cert 选项 (#3930) (@matyhtf) - 添加 Http\Request::create/parse/isCompleted (#3938) (@matyhtf) - 添加 Http\Response::isWritable (db56827) (@matyhtf) ### 增强 - Server 的所有时间精度都从 int 修改为 double (#3882) (@matyhtf) - 在 swoole_client_select 函数里面检查 poll 函数的 EINTR 情况 (#3909) (@shiguangqi) - 添加协程死锁检测 (#3911) (@matyhtf) - 支持使用 SWOOLE_BASE 模式在另一个进程中关闭连接 (#3916) (@matyhtf) - 优化 Server master 进程与 worker 进程通信的性能,减少内存拷贝 (#3910) (@huanghantao) (@matyhtf) ### 修复 - 当 Coroutine\Channel 被关闭时,pop 出里面所有的数据 (960431d) (@matyhtf) - 修复使用 JIT 时的内存错误 (#3907) (@twose) - 修复 `port->set()` dtls 编译错误 (#3947) (@Yurunsoft) - 修复 connection_list 错误 (#3948) (@sy-records) - 修复 ssl verify (#3954) (@matyhtf) - 修复 Table 递增和递减时不能清除所有列问题 (#3956) (@matyhtf) (@sy-records) - 修复使用 LibreSSL 2.7.5 编译失败 (#3962) (@matyhtf) - 修复未定义的常量 CURLOPT_HEADEROPT 和 CURLOPT_PROXYHEADER (swoole/library#77) ([@sy-records](https://github.com/sy-records)) ### 内核 - 默认情况下忽略 SIGPIPE 信号 (9647678) (@matyhtf) - 支持同时运行 PHP 协程和 C 协程 (c94bfd8) (@matyhtf) - 添加 get_elapsed 测试 (#3961) (@luolaifa000) - 添加 get_init_msec 测试 (#3964) (@luffluo) ![](https://cdn.jsdelivr.net/gh/sy-records/staticfile/images/swoole/wechat.png)
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
还没有评论!
微信公众号
热门内容
作者其它话题
- thinkphp5.1在使用think-swoole的时候报错unsupported option [host]
- WSL 下服务器响应数据过大无法接收
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。