日志

PHP基于pcntl的多进程编程

PHP可以通过PHP的进程控制函数(PCNTL)实现多进程,要注意的是,PCNTL只在UNIX LIKE OS下有效,windows是不支持的,另外如果你在编译时没有加入这个扩展则需要自行安装.

pcntl_fork

首先我们需要了解一个非常重要的函数,pcntl_fork().

pcntl_fork —— 在当前进程当前位置产生分支(子进程).fork创建了一个子进程,父进程和子进程都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程号(PID),而子进程得到的是0.通过fork创建的子进程可以看成是父进程的一个拷贝,无论是数据空间还是指令指针都完全一致,但从fork之后开始这两个父子进程就再也没有任何继承关系,两者可以看成是两个独立的进程,而fork返回值的差异可以作为父子进程的区分,也是多进程编程实现的关键.另外,如果fork失败,则会返回-1.

Talk is cheap show me the code:

#!/usr/bin/env php
<?php
date_default_timezone_set("asia/shanghai");

$pid = pcntl_fork();
if ($pid==-1) {
    die('fork失败');
} else if ($pid==0) {
    //子进程执行
    $sec = 10;
    echo date('H:i:s') .'| 我是子进程 (PID:' . posix_getpid() . ')' . ',我休眠' . $sec . '秒后结束' . PHP_EOL;
    
} else if ($pid>0) {
    //父进程执行
    $sec = 15;
    echo date('H:i:s') . '| 我是父进程 (PID:' . posix_getpid() . '),我创建了一个子进程 (PID:' . $pid . ')' . ',我休眠' . $sec . '秒后结束' . PHP_EOL;
}
sleep($sec);
echo date('H:i:s') . '| 进程(PID:'.posix_getpid().')结束' . PHP_EOL;
exit(0);

/**********************************输出*************************************
16:22:13| 我是父进程 (PID:28082),我创建了一个子进程 (PID:28083),我休眠15秒后结束
16:22:13| 我是子进程 (PID:28083),我休眠10秒后结束
16:22:23| 进程(PID:28083)结束
16:22:28| 进程(PID:28082)结束
****************************************************************************/

僵尸进程

阅读全文