zoukankan      html  css  js  c++  java
  • php多进程实现 亲测

    php多进程实现

    PHP有一组进程控制函数(编译时需要–enable-pcntl与posix扩展),使得php能在nginx系统中实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。

    CentOS 6 下yum安装php的,默认是不安装pcntl的,因此需要单独编译安装,首先下载对应版本的php,解压后

    1     cd php-version/ext/pcntl  
    2     phpize  
    3     ./configure && make && make install  
    4     cp /usr/lib/php/modules/pcntl.so /usr/lib64/php/modules/pcntl.so  
    5     echo "extension=pcntl.so" >> /etc/php.ini  
    6     /etc/init.d/httpd restart  

    方便极了。

    下面是示例代码:

     1     <?php  
     2     header('content-type:text/html;charset=utf-8' );  
     3       
     4     // 必须加载扩展  
     5     if (!function_exists("pcntl_fork")) {  
     6         die("pcntl extention is must !");  
     7     }  
     8     //总进程的数量  
     9     $totals = 3;  
    10     // 执行的脚本数量  
    11     $cmdArr = array();  
    12     // 执行的脚本数量的数组  
    13     for ($i = 0; $i < $totals; $i++) {  
    14         $cmdArr[] = array("path" => __DIR__ . "/run.php",  'pid' =>$i ,'total' =>$totals);  
    15     }  
    16       
    17     /* 
    18     展开:$cmdArr 
    19     Array 
    20     ( 
    21         [0] => Array 
    22             ( 
    23                 [path] => /var/www/html/company/pcntl/run.php 
    24                 [pid] => 0 
    25                 [total] => 3 
    26             ) 
    27      
    28         [1] => Array 
    29             ( 
    30                 [path] => /var/www/html/company/pcntl/run.php 
    31                 [pid] => 1 
    32                 [total] => 3 
    33             ) 
    34      
    35         [2] => Array 
    36             ( 
    37                 [path] => /var/www/html/company/pcntl/run.php 
    38                 [pid] => 2 
    39                 [total] => 3 
    40             ) 
    41      
    42     ) 
    43     */  
    44       
    45     pcntl_signal(SIGCHLD, SIG_IGN); //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。  
    46     foreach ($cmdArr  as   $cmd) {  
    47         $pid = pcntl_fork();    //创建子进程  
    48         //父进程和子进程都会执行下面代码  
    49         if ($pid == -1) {  
    50             //错误处理:创建子进程失败时返回-1.  
    51             die('could not fork');  
    52         } else if ($pid) {  
    53             //父进程会得到子进程号,所以这里是父进程执行的逻辑  
    54             //如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:  
    55             pcntl_wait($status,WNOHANG); //等待子进程中断,防止子进程成为僵尸进程。  
    56         } else {  
    57             //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。  
    58             $path   = $cmd["path"];  
    59             $pid = $cmd['pid'] ;  
    60             $total = $cmd['total'] ;  
    61             echo exec("/usr/bin/php {$path} {$pid} {$total}")."
    ";  
    62             exit(0) ;  
    63         }  
    64     }  
    65     ?>  
  • 相关阅读:
    如何配置android的adb环境变量
    react中 如何异步展示后台接口的提示消息
    java doc 相关
    linux 停止多个 进程...
    maven 打包 war 包含 WEB-INF/lib 目录
    对 ArrayList 进行分页.
    docker 磁盘清理 相关
    vue 在 html 中自定义 tag
    docker 限制 容器内存 使用
    mysql 基本语句
  • 原文地址:https://www.cnblogs.com/easirm/p/4189896.html
Copyright © 2011-2022 走看看