php fsockopen()方法,简化,异步非阻塞调用

版权声明:廖圣平博客,未经博主允许不得转载。企鹅:1194008361 https://blog.csdn.net/qq_22823581/article/details/77712987

介绍

在项目中遇到一个问题,就是php是同步的读取下来的,如果一个方法请求的时间长了一点, 那么整个程序走下去将会遇到阻塞,现在我想触发这个方法,但是又不影响我下下面的程序正常的走下去。查了一上午的方法, 就这个函数比较靠谱,但是会比较low 一点, 因为直接是通过url寻找我们要触发的方法。

方法

function _sock($url) {
    $host = parse_url($url,PHP_URL_HOST);
    $port = parse_url($url,PHP_URL_PORT);
    $port = $port ? $port : 80;
    $scheme = parse_url($url,PHP_URL_SCHEME);
    $path = parse_url($url,PHP_URL_PATH);
    $query = parse_url($url,PHP_URL_QUERY);
    if($query) $path .= '?'.$query;
    if($scheme == 'https') {
        $host = 'ssl://'.$host;
    }

    $fp = fsockopen($host,$port,$error_code,$error_msg,1);
    if(!$fp) {
        return array('error_code' => $error_code,'error_msg' => $error_msg);
    }
    else {
        stream_set_blocking($fp,true);//开启了手册上说的非阻塞模式
        stream_set_timeout($fp,1);//设置超时
        $header = "GET $path HTTP/1.1\r\n";
        $header.="Host: $host\r\n";
        $header.="Connection: close\r\n\r\n";//长连接关闭
        fwrite($fp, $header);
        usleep(1000); // 这一句也是关键,如果没有这延时,可能在nginx服务器上就无法执行成功
        fclose($fp);
        return array('error_code' => 0);
    }
}

例子

比如我在a站点:   http://tp5test.test/index.php/index/yibu   代码如下。

    public function index(){
        sleep('600');
        echo "kk";
    }

我在b站点触发这个方法,但是不想等待a站的返回,我只想摸一下她,其他我啥都不干。我继续做我要做的事情。

        $this->_sock('http://tp5test.test/index.php/index/yibu');
        echo "我没有等a站点返回值,我就执行了";

结论

通常直接curl 访问 a站点的值会一直等待,但是通过php的 fsockopen ,即可实现简单的最小1秒钟的阻塞。

 

 

没有更多推荐了,返回首页