PHP多进程的实现

By | 2014 年 9 月 27 日
<?php
    set_time_limit(0);
    ini_set('memory_limit', '1024M');
  
    //配合pcntl_signal使用
    declare(ticks=1);
    //最大的子进程数量
    $max = 30;
    //当前的子进程数量
    $child = 0;
    //当子进程退出时,会触发该函数
    function sig_handler($sig)
    {
        global $child;
        switch($sig) {
        case SIGCHLD:
            //echo 'SIGCHLD received'."\n";
            $child--;
        }
    }
  
    //注册子进程退出时调用的函数
    pcntl_signal(SIGCHLD, "sig_handler");
  
    while(true)
    {
        $child++;
     
        if(****) // 根据实际业务设计退出条件
        {
          break;
     }
  
        $pid = pcntl_fork();
        if (-1 == $pid)
        {
            echo date("H:i:s")." error : ×××××××";// 创建进程失败,打印错误信息
        }
        else if (!$pid)
        {
        // 业务逻辑代码
            // todo...

            exit; // 最好要有该语句
       }
        else
        {
            if ($child >= $max)
            {
                pcntl_waitpid($pid, $status);
            }
        }
    }

1.多进程之间的任务分配,比如一个表,每启动一个进程时可能要分配一个id段给该进程负责
2.设置最大进程并发数,要根据机器的性能资源进行设置,内存、cpu都要考虑
3.如果报异常:pcntl_fork(): Error 11,则需要对当前用户设置最多连接数,
命令为:limit -u 9999 ,这样就设置为了9999,默认是1024。

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据