background image

      可以给进程发送信号
  10. pcntl_singal
      用来设置信号的回调函数
当父进程退出时,子进程如何得知父进程的退出
当父进程退出时,子进程一般可以通过下面这两个比较简单的方法得知父进程已经退出这
个消息:
   1. 当父进程退出时,会有一个 INIT 进程来领养这个子进程。这个 INIT 进程的进程号为
1,所以子进程可以通过使用 getppid()来取得当前父进程的 pid。如果返回的是 1,表明父进
程已经变为

INIT 进程,则原进程已经推出。

   2. 使用 kill 函数,向原有的父进程发送空信号(kill(pid, 0))。使用这个方法对某个进程的
存在性进行检查,而不会真的发送信号。所以,如果这个函数返回

-1 表示父进程已经退出。

除了上面的这两个方法外,还有一些实现上比较复杂的方法,比如建立管道或

socket 来进

行时时的监控等等。
PHP 多进程采集数据的例子
/**
* Project: Signfork: php 多线程库
* File: Signfork.class.php
*/
class Signfork{
/**
* 设置子进程通信文件所在目录
* @var string
*/
private $tmp_path='/tmp/';
/**
* Signfork 引擎主启动方法
* 1、判断$arg 类型,类型为数组时将值传递给每个子进程;类型为数值型时,代表要创建的进程

.

* @param object $obj 执行对象
* @param string|array $arg 用于对象中的__fork 方法所执行的参数
* 如:$arg,自动分解为:$obj->__fork($arg[0])、$obj->__fork($arg[1])…
* @return array 

 

返回

array(子进程序列=>子进程执行结果);

*/
public function run($obj,$arg=1){
if(!method_exists($obj,'__fork')){
exit(“Method '__fork' not found!”);
}
if(is_array($arg)){
$i=0;
foreach($arg as $key=>$val){
$spawns[$i]=$key;
$i++;
$this->spawn($obj,$key,$val);
}