hprose-php icon indicating copy to clipboard operation
hprose-php copied to clipboard

client中的close

Open hhj1234 opened this issue 7 years ago • 6 comments

client中的close方法是个空方法,请问这个有什么作用

hhj1234 avatar Jun 14 '18 09:06 hhj1234

对于 http 客户端没有用,对于 tcp 客户端它不是空方法。

andot avatar Jun 14 '18 15:06 andot

小马哥你好,我的调用过程是这样的 A B C 1.client ----->server 2. client-----> server A调用B,同时B会从C获取一些数据,然后返回到A.

开发过程中发现B的server会产生一直不释放的状态为CLOSE_WAIT的进程,像是B的server没有正确关闭连接,这里有主动关闭连接的方式吗?两个server都是swoole的,启动参数也加了心跳,还是会有以上情况。最终会导致该连接无法再次连接,只能重新启动server

hhj1234 avatar Jun 15 '18 01:06 hhj1234

A		B 	   C
1.client----->server
            2.client-----> server

hhj1234 avatar Jun 15 '18 02:06 hhj1234

如果你用的 server 是 swoole 的,那你在 B 中使用的 http 客户端也用 swoole 版本的,而且一个全局的就可以了,不需要每次调用创建新的,swoole 版本的 http 客户端中自带连接池。

andot avatar Jun 15 '18 05:06 andot

是tcp的。我在B中的client是用的Socket/Client,尝试了下Swoole/Client,会抛出错误


{"type":1,"message":"swoole_async_set(): eventLoop has already been created. unable to create swoole_server.","file":"vendor/hprose/hprose-swoole/src/Hprose/Swoole/Socket/Client.php","line":44}

swoole文档 https://wiki.swoole.com/wiki/page/780.html 这表示你的程序在new swoole_server之前使用了其他异步IO的API,底层已经创建了EventLoop,无法重复创建。 这是错误的用法,如果要在Server中使用异步的Client、MySQL、Redis,请在Server的onWorkerStart回调函数或其他发生在Worker进程内的回调函数中使用。

我注释掉这个该处代码后可以继续执行,但是在调用C中Server注册的方法时,并没有像Socket/Client一样返回Array数据,而是返回了Hprose\Future Object

hhj1234 avatar Jun 15 '18 06:06 hhj1234

tcp 客户端。swoole 版本的只有异步调用,你可以用 Hprose\Future\co 和 yield 来实现同步的写法。

andot avatar Jun 15 '18 09:06 andot