当前位置:首页 > 建站分享 > 正文内容

file_get_contents很慢?来看看php访问url的四种方式

lujun3年前 (2021-12-22)建站分享531

在使用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()函数。


扫描二维码推送至手机访问。

版权声明:本文由5020工作室发布,如需转载请注明出处。

本文链接:http://5020.work/?id=5

分享给朋友:

相关文章

玩客云FRP穿透外网访问

玩客云FRP穿透外网访问

本方法需要用到服务器进行FRP穿透无论使用玩客云做网站还是下载机,穿透后便可不在家也能管理和访问你的玩客云之前写过玩客云怎么刷armbian+宝塔7.4.x,和玩客云如何挂载硬盘这里具体就不说了目前刚好腾讯云在做活动,2H4G8M才74一年...

dplayer + m3u8+ p2p加速

1、打开 CDNBye OMS  注册账号。添加域名-认证域名。按照里面步骤来即可。2、php代码:<html><head><title>847默认播放器</title...

使用cloudflare加速页面中有beacon.min.js加载很卡如何解决

最近有个域名因为没有国内服务器,搬家到了国外。使用了cloudflare CDN加速,不知道从什么时候开始加载变的异常缓慢。chrome不停的转圈圈就是不完成。一个网页打开到完成要1分钟。检查了下原来是一个js文件一直没有加载成功。js名称...

免费前端静态资源开源库大全(CDN公共库)

为什么使用CDN公共库?减少用户等待时间,增加网页的同时载入速度,你可以在自己的网页上直接通过script标记引用这些资源。这样做不仅可以为您 节省流量,还能通过CDN加速,获得更快的访问速度。360官网 https://cdn....

如何阻止来自 iframe 的弹出窗口?

本文介绍了如何阻止来自 iframe 的弹出窗口?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!问题描述我正在嵌入具有退出弹出窗口的页面.当您关闭页面时,它会自动启动一个弹出窗口.如何在退出时禁用来自...

文件外链网站推荐catbox

前言前几天看到一个国外网站非常有意思,它就是猫箱(译名),原名catbox猫箱:https://catbox.moe/猫箱catbox这是一个文件外链网站,就是上传一个文件,可以获得它的直链地址,别人访问这个地址就能获取文件内容比如大家想要...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。