旗下导航:搜·么
当前位置:网站首页 > PHP问题 > 正文

PHP怎样开启pcntl模块并完成多历程编程呢?【php题目】

作者:搜搜PHP网发布时间:2019-11-26分类:PHP问题浏览:93


导读:先检察下我装置的PHP版本:PHP7.3.7(cli)(built:Jul12201922:25:55)(NTS)Copyright(c)19...
先检察下我装置的PHP版本

PHP 7.3.7 (cli) (built: Jul 12 2019 22:25:55) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies

php完成多历程须要装置pcntl模块,这个模块是php官方供应的,所以我们能够在PHP源码中找到,下载 php7.3.7 源码并解压到 /home 目录下,这时刻我们须要的扩大 pcntl 在 /home/php-7.3.7/ext/pcntl

顺次实行以下敕令

phpize
./configure --with-php-config=/usr/local/bin/php-config
make & make install

这内里肯定 php-config 文件的途径能够运用 find / -name php-config 末了生成 pcntl.so 文件。

然后找到 php的ini文件地点途径 能够运用 php --ini 敕令检察

至于php的扩大模块途径能够运用 php -i | grep extension_dir 检察,然后将生成的so文件拷到模块途径下而且将 extension=pcntl 加到php.ini文件中

运用 php -m 检察模块是不是被加载!到这里pcntl 模块就装置好啦,下面最先编码

for ($i = 0; $i < 3; $i++){   
    $pid = pcntl_fork();
     if ($pid == -1) {
        die("开启历程失利");
    } elseif ($pid) { 
         echo "启动子历程 $pid \n";
    } else {
      echo "子历程 ".getmypid()." 正在处置惩罚使命\n";
      sleep(rand(5,10));
      exit;
    }
}

while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);    
    echo "子历程推出,状况码 $status \n";
}

pcntl_fork()函数建立一个子历程,胜利时,在父历程实行线程内返回发生的子历程的PID,在子历程实行线程内返回0。失利时,在 父历程上下文返回-1,不会建立子历程,而且会激发一个PHP毛病。

pcntl_waitpid() — 守候或返回fork的子历程状况,挂起当前历程的实行直到参数pid指定的历程号的历程退出, 或接收到一个信号请求中断当前历程或挪用一个信号处置惩罚函数。返回的值能够是-1,0或许 >0的值, 假如是-1, 示意子历程失足, 假如>0示意子历程已退出且值是退出的子历程pid,至于怎样退出, 能够经由过程$status状况码回响反映

root@4226aaf8d937:/home/demo# php index.php 
启动子历程 150 
启动子历程 151 
启动子历程 152 
子历程 152 正在处置惩罚使命
子历程 151 正在处置惩罚使命
子历程 150 正在处置惩罚使命
子历程推出,状况码 0 
子历程推出,状况码 0 
子历程推出,状况码 0
root@4226aaf8d937:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3   3976  3180 pts/0    Ss   04:42   0:00 bash
root        17  0.0  0.3   3868  3184 pts/1    Ss   04:48   0:00 bash
root       149  0.3  2.1  79740 21888 pts/0    S+   06:18   0:00 php index.php
root       150  0.0  0.6  79740  6664 pts/0    S+   06:18   0:00 php index.php
root       151  0.0  0.6  79740  6604 pts/0    S+   06:18   0:00 php index.php
root       152  0.0  0.6  79740  6604 pts/0    S+   06:18   0:00 php index.php
root       153  0.0  0.2   7640  2660 pts/1    R+   06:18   0:00 ps -aux

当子历程被运用 kill -9 历程id 强迫杀死的时刻怎样处置惩罚?

<?php
$pid_arr = [];
for ($i = 0; $i < 3; $i++){   
    $pid = pcntl_fork();
     if ($pid == -1) {
        die("开启历程失利");
    } elseif ($pid) { 
         echo "启动子历程 $pid \n";
         array_push($pid_arr, $pid);
    } else {
      echo "子历程 ".getmypid()." 正在处置惩罚使命\n";
      sleep(rand(5,10));
      exit;
    }
}

for ($i=0; $i < count($pid_arr); $i++) {
    while (pcntl_waitpid($pid_arr[$i], $status) != -1) {
        if(!pcntl_wifexited($status)){
            //历程非一般退出
            if(pcntl_wifsignaled($status)){
                $signal = pcntl_wtermsig($status);
                //不是经由过程接收信号中断
                echo "子历程 $pid_arr[$i] 属于非一般住手,接收到信号 $signal \n";
            }else{
                print_r("子历程 $pid_arr[$i] 完成使命并退出 \n");
            }

        }else{
            //猎取历程终端的退出状况码;
            $code = pcntl_wexitstatus($status);
            print_r("子历程 $pid_arr[$i] 一般结束使命并退出,状况码 $status \n ");
        }
    }
}

pcntl_wifexited— 搜检状况代码是不是代表一个一般的退出

pcntl_wifsignaled — 搜检子历程状况码是不是代表因为某个信号而中断

pcntl_wtermsig — 返回致使子历程中断的信号

我们翻开两个窗口 其中之一:

想相识更多相干内容请接见ki4网:PHP视频教程

以上就是PHP怎样开启pcntl模块并完成多历程编程呢?的细致内容,更多请关注ki4网别的相干文章!

标签:多进程