php中使用fsockopen实现异步请求(代码示例)-php教程

资源魔 34 0

php执行一段顺序,有可能几毫秒就执行终了,也有可能耗时较长。

例如,用户下单这个事情,假如挪用了些第三方效劳进行发邮件、短信、推送等告诉,可能招致前端不断正在期待。

而有的时分,咱们其实不关怀这些耗时剧本的前往后果,只需执行就好了。这时候候就需求采纳异步的形式执行。

家喻户晓,PHP不间接支持多线程这类货色。咱们能够采纳折中的形式完成。这里次要说的就是fsockopen

经过fsockopen发送申请并疏忽前往后果,顺序能够即刻前往。

示例代码:

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET /backend.php   HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
 
    fwrite($fp, $out);
    /*疏忽执行后果
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }*/
    fclose($fp);
}

需求留意的是咱们需求手动拼出header头信息。经过关上正文局部,能够查看申请前往后果,但这时候候又变为同步的了,由于顺序会期待前往后果才完结。

实际测试的时分发现,没有疏忽执行后果,调试的时分每一次城市胜利发送sock申请;但疏忽执行后果,常常看到不胜利发送sock申请。查看nginx日记,发现不少状态码为499的申请。

起初找到了缘由:

fwrite之后即刻执行fclose,nginx会间接前往499,没有会把申请转发给php解决。

客户端自动端口申请衔接时,NGINX 没有会将该申请代办署理给下游效劳(FastCGI PHP 过程),这个时分 access log 中会以 499 记载这个申请。

处理计划:

1)nginx.conf添加设置装备摆设

# 疏忽客户端中缀
fastcgi_ignore_client_abort on;

2)fwrite之后应用usleep函数休眠20毫秒:

usleep(20000);

起初测试就不发现失败的状况了。

附上完好代码:

<?php
/**
 * 对象类
 * */
class FsockService {
    
    public static function post($url, $param){
        $host = parse_url($url, PHP_URL_HOST);
        $port = 80;
        $errno = '';
        $errstr = '';
        $timeout = 30;
        $data = http_build_query($param);
        // create connect
        $fp = fsockopen($host, $port, $errno, $errstr, $timeout);
        if(!$fp){
            return false;
        }
        // send request
        $out = "POST ${url} HTTP/1.1\r\n";
        $out .= "Host:${host}\r\n";
        $out .= "Content-type:application/x-www-form-urlencoded\r\n";
        $out .= "Content-length:".strlen($data)."\r\n";
        $out .= "Connection:close\r\n\r\n";
        $out .= "${data}";
        fwrite($fp, $out);
        //疏忽执行后果;不然期待前往后果
//        if(APP_DEBUG === true){
        if(false){
            $ret = '';
            while (!feof($fp)) {
                $ret .= fgets($fp, 128);
            }
        }
        usleep(20000); //fwrite之后即刻执行fclose,nginx会间接前往499
        fclose($fp);
    }
    public static function get($url, $param){
        $host = parse_url($url, PHP_URL_HOST);
        $port = 80;
        $errno = '';
        $errstr = '';
        $timeout = 30;
        $url = $url.'?'.http_build_query($param);
        // create connect
        $fp = fsockopen($host, $port, $errno, $errstr, $timeout);
        if(!$fp){
            return false;
        }
        // send request
        $out = "GET ${url} HTTP/1.1\r\n";
        $out .= "Host:${host}\r\n";
        $out .= "Connection:close\r\n\r\n";
        fwrite($fp, $out);
        //疏忽执行后果;不然期待前往后果
//        if(APP_DEBUG === true){
        if(false){
            $ret = '';
            while (!feof($fp)) {
                $ret .= fgets($fp, 128);
            }
        }
        usleep(20000); //fwrite之后即刻执行fclose,nginx会间接前往499
        fclose($fp);
    }
   
}
?>

更多相干php常识,请拜访php教程!

以上就是php中应用fsockopen完成异步申请(代码示例)的具体内容,更多请存眷资源魔其它相干文章!

标签: php开发教程 php开发资料 php开发自学 fsockopen

抱歉,评论功能暂时关闭!