workman-json-rpc 调用服务时好时坏,异常recvData empty,不是超时,无报错!急!!!

alenshu

第一次接触workman-json-rpc,调用服务的时候有时候会返回recvData empty,时好时坏。超时时间我设置的15秒,但是每次都很快返回recvData empty,跟踪代码,发现是RpcClient.php文件里的recvData方法,fgets返回false(connection是正确的),请问可能是什么导致的。

2849 3 0
3个回答

walkor

应该是连接断开了,一般是业务代码发致命错误,或者业务代码调用了exit、die导致。
如果发生致命错误会在workerman.log里可以看到错误日志。
发生问题的时候php start.php status 能看到一些信息进程退出码信息

  • alenshu 2018-12-24

    感恩解答,我看只要出错,日志里抛出的就是pid:25765 worker[JsonRpc:25871] exit with status 11,翻看到了类似的帖子,这个原因是用了不稳定php扩展导致的吗(装的扩展没变,以前一直用的hprose-rpc直接调用的没有问题),还有可能是其他原因吗

blogdaren

你这个问题我也遇到过,还有一种可能就是:
Services里的业务运行超时了【即超过了 RpcClient::TIME_OUT】,对于RpcClient来说, RpcClient::TIME_OUT意味着服务端的业务必须在 RpcClient::TIME_OUT 内将数据给我扔回来,否则客户端会关闭连接。
 

  • alenshu 2018-12-24

    感恩解答,我看错误日志里显示的pid:25765 worker[JsonRpc:25871] exit with status 11,请问这个错误码是因为不稳定的php扩展导致的吗,感谢

  • blogdaren 2018-12-24

    @5200: exit with status 11 表明进程收到了 SIGSEGV 信号,SIGSEGV代表在POSIX兼容的平台上,SIGSEGV是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。
    据此推测最大可能的原因是:
    1、使用了不稳定的PHP扩展导致内存泄漏;
    2、程序本身可能导致的内存泄漏,比如使用了类的静态数组;

  • alenshu 2018-12-24

    感谢指导,起先还以为以为是zookeeper扩展的问题,删掉了RpcClient里改造的代码,后来发现是因为项目里还继承了hprose-rpc的service,去掉就好了,感谢感谢

alenshu

状态图如下

  • walkor 2018-12-24

    php 发生了coredump,可能是用了不稳定的php版本,也可能是用了不稳定的php扩展

  • alenshu 2018-12-24

    @1:感谢指导,找到了问题,因为项目里还继承了别的rpc服务端导致的,去掉就好了,还有一个问题。
    我提供的服务不用static也可以正常跑,看文档上说服务方法也要定义成static,请问如果方法不换成static的会有别的影响吗

  • walkor 2018-12-24

    没什么影响。可能会有一些提示类的php日志

  • alenshu 2018-12-25

    @1:感谢

年代过于久远,无法发表回答
🔝