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

来源:互联网 发布:影楼制作软件apk 编辑:程序博客网 时间:2024/05/21 11:40


在项目中遇到一个问题,就是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);    }}


原创粉丝点击