swoole( 网络IO 十一)

 

Pstree -apn | grep server.php

显示父进程 子进程

信号重启产生的问题

  1. 客户端发送信息没有反应

主要是子进程通过break跳出for之后进入了monitorWorkersForLinux中阻塞了,通过修改fork方法解决

swoole( 网络IO 十一)

Event :: add()

非阻塞的,不用执行类似loop的启动函数

Break/exit 避免子进程再创建子进程

 

信号安装那里阻塞了

 

  1. Stop不能停止整个程序

记录主进程pid然后停止

 

为什么父进程杀不死?

因为没有记录父进程的pid

 

信号安装是死循环,父pid记录在启动里面

 

重启:

只是停止工作进程,主进程不停止的

 

  1. 通过信号重启worker进程之后杀死父进程而子进程还会存在的问题

 

信号是怎么运行的?

1.安装  sign

2.分发  dispatch

3.调用 kill -> pid信号 ->运行(内核处理)

 

信号为什么需要循环?

因为如果不循环,只会杀死一个子进程

死循环是有多少个子进程,就可以回收多少个

 

父进程被kill,子进程依然运行

因为父进程不具备管理子进程的功能

为什么不具备?

孤儿进程,父进程已经走完,会把子进程丢弃给内核,子进程就不再收到父进程的控制

 

    调整添加对于ctrl+c操作的监听

实现模型的reload功能

记录与获取pid的操作

我们可以通过把该信息记录在文件中,这样的话我们可以再次调用worker中的reload就可以很好地重启进程

 

添加一个工具类

代码热加载

主要是针对于开发,不建议生产环境下

 

为什么修改代码之后不会生效?

Php-fpm这种运行方式是属于常驻内存,运行之后变量和属性会保存在内存中

 

启动->加载 扩展->编译代码->加载变量放在内存中->输出结果->结束 (短暂性)

 

加载变量放在内存中->输出结果  (持久性)

 

思路:

1.重新启动worker进程

2.可以在文件发生改变的时候重启  .php文件的变化

3.inotify => php监控文件的变化扩展

 

怎么用inotify?

1.inotify_init() 初始化inotify

2.inotify_add_watch() 针对于某一个文件进行监听

3.inotify_read() 读取发送变化的文件  是会阻塞的

 

1.需要获取文件目录

2.一个个把文件目录下的文件进行监听

3.每当一个文件发生改变的时候  重启worker进程

 

写成了一个类

swoole( 网络IO 十一)

心跳检测

心跳检测:

服务端->对于客户端在一定时间内进行检测

可以理解为,客户端发送了一个信息之后多久没有联系,定时器

 

1.实际上只需要延时去进行关闭连接即可

2.然后在规定的时间内清空定时器即可