php fpm kill 子进程,swoole_process,子进程自动重启及主进程退出后,子进程退出的试例....

1.子进程异常退出后,自动重启子进程,

2. 主进程异常退出后,子进程在干完当前工作后,自动退出

```php

(new class{

public $mpid=0;

public $works=[];

public $max_precess=1;

public $new_index=0;

public function __construct(){

try {

swoole_set_process_name(sprintf('php-ps:%s', 'master'));

$this->mpid = posix_getpid();

$this->run();

$this->processWait();

}catch (\Exception $e){

die('ALL ERROR: '.$e->getMessage());

}

}

public function run(){

for ($i=0; $i < $this->max_precess; $i++) {

$this->CreateProcess();

}

}

public function CreateProcess($index=null){

$process = new swoole_process(function(swoole_process $worker)use($index){

if(is_null($index)){

$index=$this->new_index;

$this->new_index++;

}

swoole_set_process_name(sprintf('php-ps:%s',$index));

for ($j = 0; $j < 16000; $j++) {

$this->checkMpid($worker);

echo "msg: {$j}\n";

sleep(1);

}

}, false, false);

$pid=$process->start();

$this->works[$index]=$pid;

return $pid;

}

public function checkMpid(&$worker){

if(!swoole_process::kill($this->mpid,0)){

$worker->exit();

// 这句提示,实际是看不到的.需要写到日志中

echo "Master process exited, I [{$worker['pid']}] also quit\n";

}

}

public function rebootProcess($ret){

$pid=$ret['pid'];

$index=array_search($pid, $this->works);

if($index!==false){

$index=intval($index);

$new_pid=$this->CreateProcess($index);

echo "rebootProcess: {$index}={$new_pid} Done\n";

return;

}

throw new \Exception('rebootProcess Error: no pid');

}

public function processWait(){

while(1) {

if(count($this->works)){

$ret = swoole_process::wait();

if ($ret) {

$this->rebootProcess($ret);

}

}else{

break;

}

}

}

});

```

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值