swoft-cloud / swoft

🚀 PHP Microservice Full Coroutine Framework
https://swoft.org
Apache License 2.0
5.58k stars 786 forks source link

RPC Client接收超过64k的数据会丢包 #316

Closed chongzi5210 closed 6 years ago

chongzi5210 commented 6 years ago
Q A
Bug report? yes/no
Feature request? yes/no
Swoft version x.y.z
Swoole version x.y.z (by php --ri swoole)
PHP version x.y.z (by php -v)
Runtime environment Win10/Mac/CentOS 7/Ubuntu/Docker etc.

Details

Describe what you are trying to achieve and what goes wrong.

// paste output here

Provide minimal script to reproduce the issue

// paste code

image

image

image

image

chongzi5210 commented 6 years ago

使用下载下来的demoService 可以做测试, getUser 直接返回数据 64k 以内可以正常返回 超过64k会报错

inhere commented 6 years ago

你配置的包最大长度是多少?

huangzhhui commented 6 years ago

eof_split也要为true,确保分包没问题

chongzi5210 commented 6 years ago

demo.zip

具体配置都配了 我下载的你们的包 在里面验证了也是一样 我把包发上来你们看看

swoole

swoole support => enabled Version => 4.0.1 Author => tianfeng.han[email: mikan.tenny@gmail.com] coroutine => enabled kqueue => enabled rwlock => enabled async redis client => enabled async http/websocket client => enabled sockets => enabled openssl => enabled pcre => enabled zlib => enabled jemalloc => enabled debug => enabled

Directive => Local Value => Master Value swoole.aio_thread_num => 2 => 2 swoole.display_errors => On => On swoole.use_namespace => On => On swoole.use_shortname => On => On swoole.fast_serialize => Off => Off swoole.unixsock_buffer_size => 8388608 => 8388608

huangzhhui commented 6 years ago

@chongzi5210 请使用最新版的 swoft 项目,并将组件更新至最新版测试,demo 缺少一下配置

'open_eof_split'     => env('TCP_OPEN_EOF_SPLIT', true),
'package_eof'        => "\r\n",

image

chongzi5210 commented 6 years ago

image

这两个参数都有的 我都测试过
发现这个问题之后,我看了swoole 相关的文档说明, 设置了open_eof_check open_eof_split package_eof 我上传的那个包里面这几个参数都没设置吗? 感觉参数没其作用不知道啥原因

chongzi5210 commented 6 years ago

image

huangzhhui commented 6 years ago

你的包里面压根没有 open_eof_split package_eof,请使用最新版的Swoft并保留open_eof_check open_eof_split package_eof参数为默认值再试

chongzi5210 commented 6 years ago

可能我打包搞错了 我确实添加了这些参数 测试了的 而且你说了之后我又检查了 设置后测试还是一样的 你用我上传的包 添加那几个参数后是正常的???

chongzi5210 commented 6 years ago

十分喜欢这个框架 也感谢你们做出这么优秀的东西 如果我打的包里面没有带上这两个参数是我的失误, 我道歉。 但是请不要怀疑我的智商。 打包问题是因为我有个项目用这个框架做的, 发现问题不好打包那个项目, 所以从下载了干净的包,添加了点测试代码, 可能转过来的时候漏掉了。

刚刚我特意搞了个新环境 composer 重新拉了代码, 检查了参数,结果依然。 如果你们确认没有问题,那就当我傻逼吧,请关闭我的问题

huangzhhui commented 6 years ago

收包分包都是Swoole来完成的,只要相关的参数被正确的配置进去,请参考 https://wiki.swoole.com/wiki/page/421.html

songweihang commented 6 years ago

@chongzi5210 我们发现这个问题,你不想等官方更新的话,你可以在 rpc-client 这个包里面的 ServiceConnection 这个协程客户端的createConnection方法修改

$client = new Client(SWOOLE_SOCK_TCP | SWOOLE_KEEP); $client->set([ 'open_eof_split' => true, 'open_eof_check' => false, 'package_eof' => "\r\n\r\n", 'package_max_length' => 1024 1024 2, ]);

这个代码即可,主要swoft 中的rpc-client 漏掉了粘包过程

huangzhhui commented 6 years ago

https://github.com/swoft-cloud/swoft-rpc-client/releases/tag/v1.0.5 https://github.com/swoft-cloud/swoft/pull/340