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);
}
file_get_contents 速度慢的解决办法
经过修改后有显示加速,代码如下:
ini_set('default_socket_timeout', 1); //关键点11111111111111;$opts = array("http" => array("method" => "GET", "timeout" => 60, "Host" => "www.****.com", "Accept" => "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Encoding" => "gzip, deflate, sdch", "Accept-Language" => "zh-CN,zh;q=0.8", "User-Agent" => "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36", "Upgrade-Insecure-Requests" => "1", "Connection:" => "close" //关键点22222222222;
= ( = @("http://www.****.com/",,);
关键是添加了这两句代码:
ini_set('default_socket_timeout', 1);
"Connection:" => "close"
参考资料:
https://segmentfault.com/q/1010000003913255
http://bbs.csdn.net/topics/391833478?page=1
虽然速度是有显示加快了,但是偶尔还是会出现抓取不到内容的情况。
以上两句代码配合 curl_init()函数会是怎么样呢?你们去试试吧。
PHP函数file_get_contents()使用 https 协议时报错:SSL operation failed
场景:
file_get_contents() 函数是用于将文件的内容读入到一个字符串中,是读取文件内容常用的函数之一。
但是有时在服务器上使用file_get_contents() 函数请求https 协议的url文件时会报错误,无法正确读取文件内容,
原因:
服务器未正确配置好https证书
解决方法:(三种解决方法)
方法一:
下载https证书到服务器
服务器 下载这个证书,http://curl.haxx.se/ca/cacert.pem
php.ini 配置
openssl.cafile = "/etc/ssl/certs/cacert.pem"//你实际下载证书的路径
重启 php 即可
方法二:
使用cURL 函数处理 https 的参数,获取文件内容
<?phpfunction getSSLPage($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSLVERSION,3); $result = curl_exec($ch); curl_close($ch); return $result; }var_dump(getSSLPage("https://xxx.xxx.xxx"));?>
引用:https://stackoverflow.com/questions/14078182/openssl-file-get-contents-failed-to-enable-crypto
方法三:
使file_get_contents()函数跳过https验证
$stream_opts = [ "ssl" => [ "verify_peer"=>false, "verify_peer_name"=>false, ] ]; $response = file_get_contents("https://xxx.xxx.xxx",false, stream_context_create($stream_opts));
开发中建议使用cURL 函数替代file_get_contents()函数。