需求:客户每提交一次表单信息,需要向对应的客户发送一封邮件,邮件发送太耗费时间了,所以使用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进程一直会是:
而用户提交几次之后就是这样的了:
话说这个编辑框,我真是醉了,使用起来真麻烦,有知道怎么才能回收这些家伙的童鞋吗,谢谢啦