关于http协议下,restart -g时造成的进程每处理一条请求就退出的问题

0

workerman版本4.0.6
现象:使用restart -g重启服务,进程每处理一个请求后就退出.客户端使用php curl,使用浏览器访问,当浏览器关闭时也会出现这个现象.而服务正常start时无此问题.
经实验发现,curl每次请求完后会关闭连接,此时TcpConnection类会destroy当前连接,进入__destruct,由于-g参数为true会走到Worker::stopAll,造成进程退出.
截图
代码是TcpConnection.php的截图,998行由于-g参数的存在,条件为真,当连接数为0时,进程退出.
请问998行到1010行的代码的作用是什么?如果删除掉会有什么影响?

已邀请:

six

赞同来自:

restart为啥要加-g ?,-g是平滑退出进程用的。

blogdaren - 常年游走于 Linux、PHP、C、VIM 之间【http://www.phpcreeper.com】

赞同来自:

我还是从个人的理解严谨下相关的概念:
1、workerman的平滑指的的是reload指令干的事情,并不是 -g 参数所起的作用,而且也不是一回事,关于什么是平滑重启,手册说的很清楚:
http://doc.workerman.net/faq/reload-principle.html
2、-g 参数正如单词gracefully含义一样,代表“优雅”行为,所以restart -g 即代表优雅重启进程,当然还有 stop -g 即代表优雅的退出进程;这里也能看出很大的区别了;


概念明确了,那我们还得从“优雅”行为背后的业务概念理解说起:
1、首先删了肯定是不行的有影响的,删了题示的那几行代码则workerman所体现的“优雅”功能荡然无存了;
2、restart -g 体现在: 如果重启之前仍有存活的TCP连接,甚至连接上还有数据的来往交互,如果没有-g, 那就相当于强硬重启进程,即原子进程立即退出,新的子进程立即补上来,原连接强制被中断,数据因此可能丢失;相反,原子进程则不会立即退出,直至该进程内的所有连接都已妥善断开才会补充一个新的子进程上来继续服务,所谓的“优雅”重启说的这个。

要回复问题请先登录注册