原因:发邮件时需要一定的等待时间,给用户的体验很不好。
解决:通过socket模拟post提交到另一个页面执行(socket提交的页面在后台执行的)。
function httpRequest($request_url, $type='get', $data=array(), $block=FALSE, $timeout=15) {
$matches = parse_url($request_url);
$scheme = $matches['scheme'];
$host = $matches['host'];
$path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';
$port = !empty($matches['port']) ? $matches['port'] : 80;
$parameter = $sep = '';
if (!empty($data)) {
foreach ($data as $key => $value){
$parameter .= $sep . urlencode($key) .'='. urlencode($value);
$sep = '&';
}
}
if (strtolower($type) == 'get') {
$path .= $parameter;
$out = "GET {$path} HTTP/1.1\r\n";
$out .= "Accept: */*\r\n";
$out .= "Accept-Language: zh-cn\r\n";
$out .= "User-Agent: {$_SERVER['HTTP_USER_AGENT']}\r\n";
$out .= "Host: {$host}:{$port}\r\n";
$out .= "Connection: Close\r\n\r\n";
} else {
$out = "POST {$path} HTTP/1.1\r\n";
$out .= "Accept: */*\r\n";
$out .= "Accept-Language: zh-cn\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "User-Agent: {$_SERVER['HTTP_USER_AGENT']}\r\n";
$out .= "Host: {$host}:{$port}\r\n";
$out .= 'Content-Length: '.strlen($parameter)."\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= $parameter;
}
if (($fp = @fsockopen($host, $port, $errno, $errstr)) == false){
//return "Error $errno: $errstr\n";
return false;
}
if ($fp) {
//将一个数据流设置为堵塞,无须等待马上返回结果。
stream_set_blocking($fp, $block);
//对数据流进行超时设置
stream_set_timeout($fp, $timeout);
@fwrite($fp, $out);
//从封装协议文件指针中获取报头/元数据
$status = stream_get_meta_data($fp);
if(!$status['timed_out']) {
while (!feof($fp)) {
if(($header = @fgets($fp)) && ($header == "\r\n" || $header == "\n")) {
break;
}
}
$return = stream_get_contents($fp);
}
@fclose($fp);
return true;
}
}
调用:
httpRequest(base_url().'/misc/sendmail.php','post',array('mail'=>'dferee@126.com','subject'=>'xxx'));
sendmail.php为发邮件的页面。
该函数执行时也要一定的等待时间,但如果去掉
if(!$status['timed_out']) {
while (!feof($fp)) {
if(($header = @fgets($fp)) && ($header == "\r\n" || $header == "\n")) {
break;
}
}
$return = stream_get_contents($fp);
}
这部分,页面立即执行完成,无需等待,但有时邮件发送不成功,这是什么原因呢?向大牛求教,或者有时什么其他的更好的方法?