PCNTL_FORK 产生的一系列问题

需求:客户每提交一次表单信息,需要向对应的客户发送一封邮件,邮件发送太耗费时间了,所以使用pcntl_fork来解决这个问题:对应代码如下:
     pcntl_signal(SIGCHLD, SIG_IGN);//如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。
     $pid = pcntl_fork();
    //父进程和子进程都会执行下面代码
    if ($pid == -1) 
    {
        //错误处理:创建子进程失败时返回-1.
         die('could not fork');
    } 
    
    if ($pid == 0) 
    {       //子进程执行的逻辑

        include_once(ROOT_PATH . 'includes/lib_clips.php');


        if($_FILES['uploadFile'] != "") {

            //处理文件上传
        for($i = 0; $i < count($_FILES['uploadFile']['name']); $i++)        //组成单一数组
            {   
                $file = $_FILES['uploadFile'];

                $thisfile['name'] = $file['name'][$i];
                $thisfile['type'] = $file['type'][$i];
                $thisfile['tmp_name'] = $file['tmp_name'][$i];
                $thisfile['error'] = $file['error'][$i];
                $thisfile['size'] = $file['size'][$i];

                if($thisfile['size'] > 1024*1024*10)
                {
                    show_message("文件应该保证10M以下!","返回重新填写","orderInteraction-".$_POST['order_sn'].".html?teacherid=".$_POST['edit_uid']);
                    exit;
                }

                $files[] = $thisfile['name'].",".upload_file($thisfile, 'feedbackimg');
                
            }

            $file_name = implode('|',$files);
       }
       else {

            $file_name = "";
       }

        $message = array(
            'user_id'     => $user_id,
            'user_name'   => $_SESSION['user_name'],
            'user_email'  => isset($_POST['user_email']) ? $_POST['user_email'] : $_SESSION['email'],
            'msg_type'    => isset($_POST['msg_type']) ? intval($_POST['msg_type'])     : 0,
            'msg_title'   => isset($_POST['msg_title']) ? trim( $_POST['msg_title'] )     : '',
            'msg_content' => isset($_POST['msg_content']) ? trim( cleanup_text($_POST['msg_content']) ) : '',
            'isnew' => '1',
            'msg_tel'     => isset($_POST['msg_tel']) ? $_POST['msg_tel']    : 0,
            'order_sn'    => isset($_POST['order_sn']) ? $_POST['order_sn']    : 0,
            'mid'         => isset($_POST['mid']) ? intval($_POST['mid'])    : 0,
            'order_id'=>empty($_POST['order_id']) ? 0 : intval($_POST['order_id']),
            'edit_uid'    => !empty($_POST['edit_uid']) ? intval($_POST['edit_uid'])    : 'no',
            'upload'      => $file_name
             
         );

        if (add_multi_message($message))
        {
            ////////////////////////////////
            if ($_POST['mid'])
            {
                $mid = intval($_POST['mid']);
                $sql = "UPDATE " .$ecs->table('feedback'). " SET isnew = 1 WHERE msg_id = '$mid'";
                $db->query($sql);
                if ($_POST['order_sn'])
                {
                    $to_id = intval($_POST['torder_id']);
                    header("Location:UserCenter.php?act=talk&order_sn=".$_POST['order_sn']."&teacherid=".$_POST['edit_uid']);
                }else
                {
                    header("Location:UserCenter.php?act=talk&order_sn=".$_POST['order_sn']."&teacherid=".$_POST['edit_uid']);
                }
            }
        }
        else
        {
            $err->show($_LANG['message_list_lnk'], 'UserCenter.php');
        }

        header("Location:UserCenter.php?   act=talk&order_sn=".$_POST['order_sn']."&teacherid=".$_POST['edit_uid']);

        exit(0);
    } 
    
    if($pid > 0)   //父执行的逻辑。    
    {

        if (intval($_REQUEST['edit_uid']))
        {
            //给编辑发邮件
            $eid = intval($_REQUEST['edit_uid']);
            $uinfo = myuser_info($eid);
            
            if ($uinfo['email'] != '')
            {
                //获取订单号
                $orderinfo = $db->getRow("SELECT order_id,order_sn FROM ". $ecs->table('order_info'). " WHERE order_sn = '$_REQUEST[order_sn]'");
                $smarty->assign('e_order_id', $_REQUEST['mid']);
                $smarty->assign('send_time', local_date($_CFG['time_format']));
                $smarty->assign('shop_name', $_CFG['shop_name']);
                $smarty->assign('send_date', local_date($_CFG['date_format']));
                $smarty->assign('user_name', $uinfo['user_name']);
                $smarty->assign('uorder_sn', $_REQUEST['order_sn']); 
                $content = $smarty->fetch('edit_kefu.dwt');
                $subject = $_LANG['email_notice'];
                send_mail($uinfo['user_name'], "[email protected]","WordSunny System Prompt: A New Message for You", $content, 1);
            }
       
        }

        exit(0);
    }

如我加显示的地方所示,现在的问题是这样,不论我设置如何,我在服务端发现对应的,用户每次一提交一次表单,httpd服务器会增加一个进程,关键是,这个进程是不会消失的!!!,如此这样可不行,但是指定叫Init去回收僵尸进程也没作用,重启之后的httpd进程一直会是:




而用户提交几次之后就是这样的了:

话说这个编辑框,我真是醉了,使用起来真麻烦,有知道怎么才能回收这些家伙的童鞋吗,谢谢啦


猜你喜欢

转载自blog.csdn.net/th_php/article/details/79025165