欲忘树 发表于 2017-12-29 23:49:01

PHP进程通信基础

<?php  $parentpid = posix_getpid();
  echo "parent progress pid:{$parentpid}\n";
  //定义一个信号处理函数
  function sighandler($signal) {
  if ($signal == SIGINT) {
  $pid = getmypid();
  exit("{$pid} process, Killed!".PHP_EOL);
  }
  }
  //phpversion < 5.3 .每执行一条低级指令,就检查一次是否出现该信号。效率损耗很大。
  //declare(ticks=1);
  $child_list = [];
  //注册一个信号处理器。当发出该信号的时候对调用已定义的函数
  pcntl_signal(SIGINT, 'sighandler');
  for($i = 0; $i < 3; $i++) {
  $pid = pcntl_fork();
  if ($pid == 0) {
  //子进程
  while (true) {
  //调用已安装的信号信号处理器,为了检测是否有新的信号等待dispatching
  pcntl_signal_dispatch();
  echo "I am child: ".getmypid(). " and i am running !".PHP_EOL;
  sleep(rand(1,3));
  }
  } elseif($pid > 0) {
  $child_list[] = $pid;
  } else {
  die('fork fail!'.PHP_EOL);
  }
  }
  sleep(5);
  foreach ($child_list as $key => $pid) {
  posix_kill($pid, SIGINT);
  }
  sleep(2);
  echo "{$parentpid} parent is end".PHP_EOL;
页: [1]
查看完整版本: PHP进程通信基础