异步调用发邮件页面

原因:发邮件时需要一定的等待时间,给用户的体验很不好。

解决:通过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);
            }
这部分,页面立即执行完成,无需等待,但有时邮件发送不成功,这是什么原因呢?向大牛求教,或者有时什么其他的更好的方法?



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值