这里所谓的多线程,指的是在不影响正常程序的基础上,可以同时访问其他的链接或者命令, 执行其他的程序。这里仅仅是记录一下相关的代码。
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)<br />\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