file_get_contents很慢?来看看php访问url的四种方式
在使用file_get_contents方式访问URL的时候,会导致速度变的很慢,据说这是file_get_contents的一个bug,本文主要介绍PHP引入url的四种方式,其中包括file_get_contents,但是并不推荐使用。
本站首页的随机语录原本使用file_get_contents的方式访问API接口,但是在经过测试后发现速度很明显下降,而且file_get_contents还有可能会导致PHP-FPM的进程CPU达到100%,为了解决问题我在百度翻了一圈之后发现curl更合适,速度也更快了,推荐!!
1、fopen方式(访问指定URL函数)
function access_url($url) { if($url=='') return false; $fp = fopen($url, 'r') or exit('Open url faild!'); if($fp){ while(!feof($fp)) { $file .= fgets($fp) . ""; } fclose($fp); } return $file; }
2、file_get_contents方式(打开远程文件的时候会造成CPU飙升。file_get_contents其实也可以post)
//以post方式获取url $data = array ('foo' => 'bar'); $data = http_build_query($data); $opts['http'] = array ( 'method' => 'POST', 'header'=> "Content-type:application/x-www-form-urlencodedrn". "Content-Length: " . strlen($data) . "rn", 'content' => $data ); $context = stream_context_create($opts); $html = file_get_contents('http://localhost/test.html', false, $context); echo $html;
3、curl方式(推荐)
function curl_file_get_contents($durl){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $durl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回 curl_setopt($ch, CURLOPT_BINARYTRANSFER, true) ; // 在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回 $data = curl_exec($ch); curl_close($ch); return $data; }
4、fsockopen方式(只能获取网站主页信息,其他页面不可以)
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30); (!$fp) { echo "$errstr ($errno)<br />\n"; }else { $out="GET / 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); }