首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
协程HTTP2响应问题
### 问题描述 使用HTTP2协程客户端请求接口时,收到的响应远小于发送的请求数量。 ### Swoole版本,PHP版本,以及操作系统版本信息 ``` php PHP 7.2.34 (cli) (built: Oct 22 2020 10:22:35) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.2.34, Copyright (c) 1999-2018, by Zend Technologies ``` ``` swoole Swoole => enabled Author => Swoole Team <team@swoole.com> Version => 4.5.5 Built => Oct 26 2020 16:00:26 coroutine => enabled epoll => enabled eventfd => enabled signalfd => enabled cpu_affinity => enabled spinlock => enabled rwlock => enabled sockets => enabled openssl => OpenSSL 1.0.2n 7 Dec 2017 http2 => enabled pcre => enabled zlib => 1.2.3 mutex_timedlock => enabled pthread_barrier => enabled futex => enabled mysqlnd => enabled async_redis => enabled Directive => Local Value => Master Value swoole.enable_coroutine => On => On swoole.enable_library => On => On swoole.enable_preemptive_scheduler => Off => Off swoole.display_errors => On => On swoole.use_shortname => Off => Off swoole.unixsock_buffer_size => 8388608 => 8388608 ``` ### 相关代码 ```php use \Swoole\Coroutine\Http2\Client as Http2Client; use \Swoole\Http2\Request as Http2Request; use Swoole\Http2\Response as Http2Response; $http2Client = new Http2Client('api.push.apple.com', 443, true); $http2Client->set([ 'ssl_cert_file' => '/pem/to/path', 'ssl_key_file' => '/pem/to/path', 'timeout' => 5, ]); $http2Client->connect(); $http2Request = new Http2Request(); $http2Request->method = 'POST'; $http2Request->headers = 'xxxxxxxxx'; $http2Request->data = json_encode(['xxxxxxxx']); $tokens = []; // 300个值 // 发送请求 foreach ($tokens as $token) { /** @var Http2Client $http2Client */ $http2Request->path = sprintf('/3/device/%s', $token); $streamId = $http2Client->send($http2Request); } // 接收响应 $responseNumber = 0; while ($http2Client->connected) { $response = $http2Client->recv(3); $responseNumber++; /**@var $response Http2Response */ if ($response) { // .... if (count($tokens) === $responseNumber) { break; } } else { break; // 退出 } } echo count($tokens) . PHP_EOL; // 输出 300 echo $responseNumber . PHP_EOL; // 输出 小于300 在100-200之间波动 ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 300个send,接收回来的远小于300。不知道问题出在哪里
发布于5年前 · 11 次浏览 · 来自
提问
包
### 问题描述 使用HTTP2协程客户端请求接口时,收到的响应远小于发送的请求数量。 ### Swoole版本,PHP版本,以及操作系统版本信息 ``` php PHP 7.2.34 (cli) (built: Oct 22 2020 10:22:35) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.2.34, Copyright (c) 1999-2018, by Zend Technologies ``` ``` swoole Swoole => enabled Author => Swoole Team <team@swoole.com> Version => 4.5.5 Built => Oct 26 2020 16:00:26 coroutine => enabled epoll => enabled eventfd => enabled signalfd => enabled cpu_affinity => enabled spinlock => enabled rwlock => enabled sockets => enabled openssl => OpenSSL 1.0.2n 7 Dec 2017 http2 => enabled pcre => enabled zlib => 1.2.3 mutex_timedlock => enabled pthread_barrier => enabled futex => enabled mysqlnd => enabled async_redis => enabled Directive => Local Value => Master Value swoole.enable_coroutine => On => On swoole.enable_library => On => On swoole.enable_preemptive_scheduler => Off => Off swoole.display_errors => On => On swoole.use_shortname => Off => Off swoole.unixsock_buffer_size => 8388608 => 8388608 ``` ### 相关代码 ```php use \Swoole\Coroutine\Http2\Client as Http2Client; use \Swoole\Http2\Request as Http2Request; use Swoole\Http2\Response as Http2Response; $http2Client = new Http2Client('api.push.apple.com', 443, true); $http2Client->set([ 'ssl_cert_file' => '/pem/to/path', 'ssl_key_file' => '/pem/to/path', 'timeout' => 5, ]); $http2Client->connect(); $http2Request = new Http2Request(); $http2Request->method = 'POST'; $http2Request->headers = 'xxxxxxxxx'; $http2Request->data = json_encode(['xxxxxxxx']); $tokens = []; // 300个值 // 发送请求 foreach ($tokens as $token) { /** @var Http2Client $http2Client */ $http2Request->path = sprintf('/3/device/%s', $token); $streamId = $http2Client->send($http2Request); } // 接收响应 $responseNumber = 0; while ($http2Client->connected) { $response = $http2Client->recv(3); $responseNumber++; /**@var $response Http2Response */ if ($response) { // .... if (count($tokens) === $responseNumber) { break; } } else { break; // 退出 } } echo count($tokens) . PHP_EOL; // 输出 300 echo $responseNumber . PHP_EOL; // 输出 小于300 在100-200之间波动 ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 300个send,接收回来的远小于300。不知道问题出在哪里
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2020-11-14
包
在hyperf框架里面使用的
赞
0
回复
2020-11-14
Rango
苹果提供的接口是否有并发限制,请确认一下。可以使用`tcpdump`抓包分析。
赞
0
回复
2022-04-21
小
小志
回复
Rango
我也遇到同样问题了,tcpdump抓包看返回正常,但是框架里提示connect timeout
赞
0
回复
2022-04-21
小
小志
回复
Rango
我也遇到同样问题了,tcpdump抓包看返回正常,但是框架里提示connect timeout
赞
0
回复