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)结束 ****************************************************************************/