php 父进程,教你一招如何使用 php 父子进程坑人

现在项目中大多都会使用MQ(消息队列)用来解耦和提升服务稳定性,然后都会面临一个问题,就是消息积压,解决这个问题除了提升处理消息的速度以外,另外就是多开些消费者进程,并发的消费数据。

如果是其他语言可以多开些线程或协程消费数据,但是这些东西,在 php 里并没有很好地支持,所以大家多采用多进程的方式来增加消费者,然后这里又有了两种方式,父子多进程和普通多进程。

然后这里就有了一个有趣的坑人方法,小小一技就能把人坑的想打你,那就是使用父子进程。

这是 php 使用父子进程的一个伪代码

$pid = pcntl_fork();

//父进程和子进程都会执行下面代码

if ($pid == -1) {

//错误处理:创建子进程失败时返回-1.

die('could not fork');

} else if ($pid) {

//父进程会得到子进程号,所以这里是父进程执行的逻辑

pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。

} else {

//子进程得到的$pid为0, 所以这里是子进程执行的逻辑。

}

那么怎么坑人呢?

坑人第一步,监听 signal

//使用ticks需要PHP 4.3.0以上版本

declare(ticks = 1);

//信号处理函数

function sig_handler($signo)

{

switch ($signo) {

case SIGTERM:

// 我不想被 kill

break;

case SIGINT:

// 我不想被 kill

break;

default:

// 处理所有其他信号

}

}

只需要监听两个,一个是监听的 ctrl+c 的 SIGINT ,另外一个是 kill 的默认 signal (不带任何参数就是使用的这个) SIGTERM,一般人都是用这里俩方法 kill 进程,只要监听这俩信号不让进程退出,然后其他人想要像重启进程产生的第一个想法就是 kill -9,kill -9 子进程不会被干掉,赞,这样就进了我们的套。

坑人第二步,修改子进程的名字,随便修改成一个相关不太相关的都行,但是不能和父进程有同样的关键词,自己能看懂就行,坑别人的同时也得给自己留条路不是,总之就是不要让别人使用 ps grep 的时候发现这是子进程,这是 php 设置进程名的一个函数

setproctitle("myscript");

如果 php version >= 5.5.0 可以用这个

cli_set_process_title("myscript")

假如使用这种方式在测试环境消费MQ数据,其他人在修了代码并重启进程,就会发现自己的数据总是莫名其妙的消失,而且还找不到是谁消费的,如果是kafka或者nsq之流还可以通过新增group或channel的方式继续开发,但是如果是 redis 的 list 做 MQ ,嘿嘿……

坑人的同时也得防止被坑不是,我们需要处理这种事情的时候,先找到主进程 pid ,然后使用这个命令

ps --ppid 父进程的pid

我懂得,你肯定想喷我,你这人这么怎么缺德,呵呵呵,我就是被人这么坑了一会,才这么印象深刻,难受。

更多架构、PHP、GO相关踩坑实践技巧请关注我的公众号:PHP架构师

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值