PHP 实现平滑关闭/重启
写过 CLI 常驻进程的老司机肯定遇到过这么一个问题:在需要更新程序的时候,我要怎样才能安全关闭老进程?你可能会想到 NGINX
、php-fpm
之类的平滑重启是给进程发送 USR2
信号,然后它就会将当前请求处理完再退出。
但进程是怎样接收信号、处理信号,估计就不是很多人能说清楚了。
写过 CLI 常驻进程的老司机肯定遇到过这么一个问题:在需要更新程序的时候,我要怎样才能安全关闭老进程?你可能会想到 NGINX
、php-fpm
之类的平滑重启是给进程发送 USR2
信号,然后它就会将当前请求处理完再退出。
但进程是怎样接收信号、处理信号,估计就不是很多人能说清楚了。
写 PHP CLI 程序的老司机们可能经常会写一些常驻进程,比如消息队列消费者进程,这些进程会一直运行,除非要发版,不然一般不会重启的,所以程序程序是不可能由我们通过 ssh 登录到服务器上通过终端来直接启动的(因为一旦断开 ssh 进程就退出了),常见的做法就是用 systemd
或者 supervisor
来使其成为 守护进程
,这样进程就可以一直运行,遇到错误意外退出也能被自动重启。
好学的你可能会思考守护进程到底是怎么实现的?为什么有的程序既可以自己就成为守护进程,又可以通过 systemd
来后台运行?如果不依赖外部,我们的 PHP 程序该怎样变成守护进程呢?
众所周知,Go struct 定义方法时使用指针还是值的区别就是在方法内修改属性值时,用值定义的方法所做的修改只限于方法内,而指针则没有这个局限。
文章如果到这里就结束了,那么就很平平无奇了,于是我打算带大家去做个无聊但是值得思考的实验。
int*
和 int
说起“int**
是什么” 这个问题其实不难。
我们可以递归分析,先看下 int*
是什么,嗯?好像还可以继续递归到 int
我们都知道,int
是 C 的基础数据类型 整型
,而多了个 *
的 int*
是 指向整型变量的指针
,那么 int**
是什么就不言自明了,列个表:
C语法 | 释义 |
---|---|
int | 整型 |
int* | 指向整型 的指针 |
int** | 指向指向整型的指针 的指针 |
看到这里,你对 int**
应该有了个初步的认识,但你可能觉得有点绕,没关系,下面我们写一段代码看看: