• 关于可控进程数的PHP多进程以及信号控制


    注册博客园2年了,工作也2年了,还没有进来发过文章,先来试试。

     1 declare(ticks=1);
     2 $max = 5;
     3 $child = 1;
     4 function sig_handler($sig){
     5     global $child;
     6     switch ($sig){
     7         case SIGCHLD:
     8             echo 'sigchld received'."\n";
     9             $child --;
    10             break;
    11     }
    12 }
    13 pcntl_signal(SIGCHLD,'sig_handler'); //SIGCHLD 安装信号 子进程结束时候调用
    14 //pcntl_signal(SIGCHLD,SIG_IGN);
    15 while (true){
    16     $child ++;
    17     /**
    18      * pcntl_fork 函数返回2个值 一个为0:表示为子进程,一个为正整数,表示为子进程ID 区别为:父进程在执行时候返回为正整数即子进程ID,子进程在执行时候返回为0
    19      */
    20     $pid = pcntl_fork();
    21     if($pid){     //父进程
    22         if($child > $max){
    23             //如果子进程数超过了最大值,则挂起父进程
    24             pcntl_wait($status);
    25         }
    26     }else{         //子进程 可以用pcntl_exec执行其他代码
    27         echo "starting new child | now we have {$child} child process\n";
    28         sleep(rand(3,5));
    29         exit();
    30     }
    31 }

    首先关于declare我看手册也是看的懵里懵懂的,手册上只是说【定义Tick 是一个在 declare 代码段中解释器每执行 N 条低级语句就会发生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 来指定的。】

    这里是配合着pcntl_signal来进行使用,

    pcntl_signal(SIGCHLD,'sig_handler'); //SIGCHLD 安装信号 子进程结束时候调用

    SIGCHLD等信号就是linux里面的信号,可以去网站查一下,linux信号还有很多,比如说SIGTERM【程序结束(terminate)信号】

    SIGHUP【终端的控制进程结束时信号】

    pcntl_signal只是进行信号安装,然后在子进程结束的时候触发sig_handler方法,在此方法里面可以捕获导子进程结束信号

     
  • 相关阅读:
    PHP中的call_user_func()与call_user_func_array()简单理解
    PHP实现多继承
    PHP实现多继承 trait 语法
    PHP几种常见魔术方法与魔术变量解析
    tp5 的nginx配置
    PHP 扩展 trie-tree, swoole过滤敏感词方案
    PHP Ajax跨域问题解决办法
    附加个人作业
    学完软工的感受
    团队介绍
  • 原文地址:https://www.cnblogs.com/honeybaobao/p/2845620.html
Copyright © 2020-2023  润新知