php实现多进程多线程

Posted 冰炏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php实现多进程多线程相关的知识,希望对你有一定的参考价值。

  孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

  僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

  僵尸进程危害:如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。

  已经产生的僵尸进程,解决方法:kill掉父进程,它产生的僵死进程就变成了孤儿进 程,这些孤儿进程会被init进程接管,init进程会wait()这些孤儿进程,释放它们占用的系统进程表中的资源。

  僵尸进程解决办法

  (1)通过信号机制

    子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。

  (2)fork两次
    《Unix 环境高级编程》8.6节说的非常详细。原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程。

 

1. [代码]php实现多进程并行操作(可做守护进程) 

 1 /**
 2  * 入口函数
 3  * 将此文件保存为 ProcessOpera.php
 4  * 在terminal中运行 /usr/local/php/bin/php ProcessOpera.php & 
 5  * 查看进程 ps aux|grep php
 6  */
 7  
 8  
 9 ProcessOpera("runCode", array(), 8);
10  
11 /**
12  * run Code
13  */
14 function runCode($opt = array()) {
15    //需要在守护进程中运行的代码
16 }
17  
18 /**
19  * $func为子进程执行具体事物的函数名称
20  * $opt为$func的参数 数组形式
21  * $pNum 为fork的子进程数量
22  */
23 function ProcessOpera($func, $opts = array(), $pNum = 1) {
24     while(true) {
25         $pid = pcntl_fork();
26         if($pid == -1) {
27             exit("pid fork error");
28         }   
29         if($pid) {
30             static $execute = 0;
31             $execute++;
32             if($execute >= $pNum) {
33                 pcntl_wait($status);
34                 $execute--;
35             }   
36         } else {
37             while(true) {
38                 //somecode
39                 $func($opts);
40                 sleep(1);
41             }   
42             exit(0);
43         }   
44     }   
45 }

 


以上是关于php实现多进程多线程的主要内容,如果未能解决你的问题,请参考以下文章

php实现多进程多线程

线程学习知识点总结

PHP多线程

八.多进程与多线程

php 实现多线程编程

多个请求是多线程吗