PHP如何开启pcntl模块并实现多进程编程呢?

先查看下我安装的php版本

PHP 7.3.7 (cli) (built: Jul 12 2019 22:25:55) ( NTS )Copyright (c) 1997-2018 The PHP GroupZend 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-configmake & make install

登录后复制

这里面确定 php-config 文件的路径可以使用   find / -name php-config   最后生成 pcntl.so 文件。

然后找到 php的ini文件所在路径 可以使用   php –ini   命令查看

立即学习“PHP免费学习笔记(深入)”;

至于php的扩展模块路径可以使用  php -i | grep extension_dir   查看,然后将生成的so文件拷到模块路径下并且将  extension=pcntl  加到php.ini文件中

使用 php -m 查看模块是否被加载!到这里pcntl 模块就安装好啦,下面开始编码

for ($i = 0; $i 

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 -auxUSER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot         1  0.0  0.3   3976  3180 pts/0    Ss   04:42   0:00 bashroot        17  0.0  0.3   3868  3184 pts/1    Ss   04:48   0:00 bashroot       149  0.3  2.1  79740 21888 pts/0    S+   06:18   0:00 php index.phproot       150  0.0  0.6  79740  6664 pts/0    S+   06:18   0:00 php index.phproot       151  0.0  0.6  79740  6604 pts/0    S+   06:18   0:00 php index.phproot       152  0.0  0.6  79740  6604 pts/0    S+   06:18   0:00 php index.phproot       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 ";         array_push($pid_arr, $pid);    } else {      echo "子进程 ".getmypid()." 正在处理任务";      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 ";            }else{                print_r("子进程 $pid_arr[$i] 完成任务并退出 ");            }        }else{            //获取进程终端的退出状态码;            $code = pcntl_wexitstatus($status);            print_r("子进程 $pid_arr[$i] 正常结束任务并退出,状态码 $status  ");        }    }}

登录后复制

pcntl_wifexited— 检查状态代码是否代表一个正常的退出

pcntl_wifsignaled — 检查子进程状态码是否代表由于某个信号而中断

pcntl_wtermsig — 返回导致子进程中断的信号

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

PHP如何开启pcntl模块并实现多进程编程呢?

PHP如何开启pcntl模块并实现多进程编程呢?

想了解更多相关内容请访问PHP中文网:PHP视频教程

以上就是PHP如何开启pcntl模块并实现多进程编程呢?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2158957.html

(0)
上一篇 2025年2月25日 07:21:38
下一篇 2025年2月19日 13:39:35

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • php怎么解决多进程同时写一个文件的问题?

    php解决多进程同时写一个文件的方法:首先复制需要更新的文件,并更改文件名;然后检查最后更新时间和先前所保存的时间是否一致;最后将所修改的临时文件重命名到原文件。 php解决多进程同时写一个文件的方法: 首先PHP是支持进程的而不支持多线程…

    2025年2月25日
    200
  • php如何实现多进程

    php实现多进程的方法:通过pcntl与posix扩展来实现。根据需求我们可以使用pcntl_fork()函数创建子进程,使用pcntl_wait()函数来阻塞当前进程。 php多进程需要pcntl,posix扩展支持。 多进程实现只能在c…

    2025年2月24日
    200
  • PHP7之多进程初探

    准备 我们都知道PHP是单进程执行的,PHP处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,但PHP实现多进程也意义重大,尤其是在后台Cli模式下处理大量数据或运行后台DEMON守护进程时,多进程的优势不用多说。 PHP…

    编程技术 2025年2月23日
    200
  • PHP 多进程调试:并发代码的故障排除

    问题:如何调试 php 中的多进程程序?技巧:使用 xdebug 进行多进程感知调试。设置断点,分别附加到每个进程。使用 dbg:signal 信号调试器以依次附加到进程。实战案例:调试多进程 web 服务时,发现响应始终为 404。通过依…

    2025年2月19日
    200
  • 如何处理PHP开发中的多进程和任务调度

    如何处理PHP开发中的多进程和任务调度 一、前言 在PHP开发中,如果需要处理大量的并发任务或者定时任务,我们通常会用到多进程和任务调度。本文将详细介绍如何在PHP开发中处理多进程和任务调度,并提供具体的代码示例,帮助读者更好地理解和应用这…

    2025年2月19日
    200

发表回复

登录后才能评论