Hi,walkor,
目前该问题已是在生产项目上,我在PHP脚本里面直接引用RPCclient.php,然后远程调用RPC服务器往数据库里写数据,脚本执行完一段时间后发现脚本的进程退出了,看了一下日志是RPC抛异常了:Uncaught exception 'Exception' with message 'recvData empty',导致脚本进程退出
我有几点想请问一下:
1,Uncaught exception 'Exception' with message 'recvData empty'是什么原因导致的?,我看了下代码是没有问题的(因为正常跑过一段时间),看了下RPC服务器中workerman.log中也没异常日志,
2,远程请求RPC时,Uncaught exception 'Exception' with message 'recvData empty' 这种异常是不能避免的吗?
3.如果我有asend_ 异常方法调用的话,会出现这种异常吗?如果出现了,但对脚本进程有影响吗?
谢谢walkor解答!
recvData empty 意思是客户端发给服务端的请求超过5秒还没有返回结果,也就是说rpc服务端处理超时了。
应该是rpc的业务比较慢导致的。具体为什么慢需要你们自己定位,可能是msyql语句执行的慢、可能是curl访问外部接口慢等等原因。
https://github.com/walkor/workerman-JsonRpc/blob/master/Applications/JsonRpc/Clients/RpcClient.php#L56
超时时间是这里设置的,超时时间默认是5秒。
asend_ 异常方法调用的话,如果服务端超时,也会出现这种异常。
好的 谢谢walkor, 我这边的业务是轮询新闻消息池,消息池里面有消息的话,就不断的远程调用workerman-RPC,每条传输的数据大约3k左右,昨天我换了asend_ 异部调用,今天查看了下Log日志,发现WORKER EXIT UNEXPECTED E_ERROR Allowed memory size of 335544320 bytes exhausted (tried to allocate 65536 bytes),允许的内存用尽了,是不是asend_异常不适合这种大量请求的业务场景? 调用RPC的时候是不是发送数据不宜过大?
RPC方法里面的业务 主要是将新闻资讯等写入数据库
WORKER EXIT UNEXPECTED E_ERROR Allowed memory size of 335544320 bytes exhausted (tried to allocate 65536 bytes)
看起来像是客户端给rpc服务端发起了超大的请求导致的。
不过也有可能是业务有内存泄漏导致的。
是的 内存满了,walkor ,我找到原因在哪里了,是因为脚本不断通过异常方式asend_ 远程调用RPC服务导致连接数(connections)不断增加导致的,我在测试机上测试了一下,把RPC服务里面被调用的方法的业务全部注释掉了,只留一个空方法,结果还是一样,达到一定连接数时,内存就满了(如附件图所示)
测试的时候,status里面显示connections是不断增加的,连接并没有释放掉
请问一下,asend_ 异步调用rpc服务后不会马上就断开连接的吗? 如果不是,那连接是什么时候断开的呢?
asend_会建立链接
arecv_会关闭链接
看看是不是没有调用arecv_
好的 谢谢walkor,没有调用 arecv_,现在代码已经加上,再跑一天试试