php之异步执行

近来做一网站因为需要在提交一个表单的时候发邮件给N多人,但用户反映每次提交表单总是要等好久,所以用户体验不好。

一般情况下,处理这样的表单提交的流程可以分解为:
用户提交表单→ 将表单内容写入数据库→发邮件给收件人→提示表单提交完成。
而往往在发邮件的过程中会消耗掉一大部分时间,造成用户体验不好。

这里可以用到php的异步执行方法:在提交表单后将内容写入到数据库,然后把发邮件的任务交给了另一个用来发信的php程序处理,接着提示用户已经提交表单完成咯。。。

异步执行的过程就变成了:
用户提交表单→ 将表单内容写入数据库→提示表单提交完成。
             |- 发邮件给收件人

php本不具备多线程执行能力,所以就用异步执行来模拟多线程解决问题,也就是利用php的fsockopen()、fputs()两个函数来重新提交一个url的请求,所以不需要等待它的返回。代码如:

<?php
//getpost.php
function sendmail() {
    $fp=fsockopen('localhost',80,&$errno,&$errstr,10);
	$para = "mail=".$_POST['mail'];
    $header = "POST /sendmail.php HTTP/1.0 \r\n";
	$header .= "Content-Type: application/x-www-form-urlencoded \r\n";
	$header .= "Content-Length:".strlen($para). "\r\n";
    fputs($fp,$header.$para); //请求sendmail程序处理
    fclose($fp);
} 
/*
//处理表单并写入数据库中。
*/
sendmail();
echo "表单提交完成咯";

?>

另一个程序:

<?php
//sendmail.php
set_time_limit(0); //设置脚本超时时间为不超时
/*
// 处理发邮件代码
*/
?>