php多线程编程代码实例

      这里所谓的多线程,指的是在不影响正常程序的基础上,可以同时访问其他的链接或者命令, 执行其他的程序。这里仅仅是记录一下相关的代码。

1、popen方式

    /*
 * popend的方式
 * */
    public function popenDownload($url)
    {
        $pageURL = 'http';
        if ( isset($_SERVER['HTTPS']) && $_SERVER["HTTPS"] == "on")
        {
            $pageURL .= "s";
        }
        $pageURL .= "://";
        if ($_SERVER["SERVER_PORT"] != "80")
        {
            $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] .$url;
        }
        else
        {
            $pageURL .= $_SERVER["SERVER_NAME"] . $url;
        }
        pclose(popen($pageURL.'&', 'r'));
    }

这里需要注意的是,popen的参数应该是命令,可以是命令行之类的。

2、fsockopen方式

 /*
     * fsockopen方法实现异步请求
     * */
    public function fsockopenDownload($url)
    {
        $pageURL = 'http';
        if ( isset($_SERVER['HTTPS']) && $_SERVER["HTTPS"] == "on")
        {
            $pageURL .= "s";
        }
        $pageURL .= "://";
        if ($_SERVER["SERVER_PORT"] != "80")
        {
            $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] .$url;
        }
        else
        {
            $pageURL .= $_SERVER["SERVER_NAME"] . $url;
        }
        $host = parse_url($pageURL,PHP_URL_HOST);
        $port = parse_url($pageURL,PHP_URL_PORT);
        $port = $port ? $port : 80;
        $scheme = parse_url($pageURL,PHP_URL_SCHEME);
        $path = parse_url($pageURL,PHP_URL_PATH);
        $query = parse_url($pageURL,PHP_URL_QUERY);
        if($query) {
            $path .= '?' . $query;
        }
        if($scheme == 'https') {
            $host = 'ssl://'.$host;
        }
        $fp=fsockopen($host,$port,$error,$errorStr,0);
        if(!$fp){
            echo "$errorStr ($error)
\n"; } stream_set_blocking($fp,false);//开启了手册上说的非阻塞模式 stream_set_timeout($fp,1);//设置超时 $header = "GET $path HTTP/1.1".PHP_EOL; $header.="Host:".$host.PHP_EOL; $header.="Connection: close".PHP_EOL;//长连接关闭 fwrite($fp, $header); usleep(3000); // 这一句也是关键,如果没有这延时,可能在nginx服务器上就无法执行成功 fclose($fp); }

参考链接:https://www.cnblogs.com/xuey/p/8463009.html

3、经典的curl方式

 /*
     * 封装的curl请求方法
     * */
    public function curl_init($url)
    {
        $pageURL = 'http';
        if ( isset($_SERVER['HTTPS']) && $_SERVER["HTTPS"] == "on")
        {
            $pageURL .= "s";
        }
        $pageURL .= "://";
        if ($_SERVER["SERVER_PORT"] != "80")
        {
            $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] .$url;
        }
        else
        {
            $pageURL .= $_SERVER["SERVER_NAME"] . $url;
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $pageURL);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
        curl_setopt($ch, CURLOPT_TIMEOUT, 1);
        curl_exec($ch);
       // $data = curl_error($ch);
        curl_close($ch);
    }

curl是比较常用的一种方式,可以通过curl_error查看错误,通过curl_getinfo()查看相关信息。

参考链接:https://www.cnblogs.com/beringxue/p/7919110.html

这里只是记录下自己工作上用到的“多线程”请求方式,不一定是正确的,辩证看待。

end

你可能感兴趣的:(php开发)