本文作者:DurkBlue

php中file_get_contents函数怎么读取大容量文件推荐

DurkBlue 2020-02-01 1853 抢沙发
php中file_get_contents函数怎么读取大容量文件摘要:         今天博客里关于”极品笑话“和”土味情话“栏目的天行数据api调用次数免费api调用次...

        今天博客里关于”极品笑话“和”土味情话“栏目的天行数据api调用次数免费api调用次数已经用尽了。彻底弹尽粮绝了。来逛我的博客再也看不到新鲜的笑话和情话了。。。不过没关系,自从接通天行数据以来我其实早就了解到会有这么一天到来。


php中file_get_contents函数怎么读取大容量文件  第1张

        因为不舍得给天行数据官方充钱冲额度。最主要的重点是没钱。。。当代年轻人的三大压力分别为父母,房子,车子。以房子最为主要的经济压力之一。我靠,不小心扯淡了,赶紧回归主题。

        

        所以呢只好利用天行数据官方给新用户免费调用一万次api的机会,把它每一次返回的极品笑话和土味情话数据通过php中file_put_contents()函数给写入进了相应的TXT文件中。现在是时候把已经生成的TXT文件数据来使用了。可没想到事情一波三折,好事多磨。在用php中的file_get_contents()函数获取“极品笑话”的TXT文本数据时候又出现了岔子。


php中file_get_contents函数怎么读取大容量文件  第2张

后来通过了解file_get_contents()函数。发现了原来这种函数只能将不大于5M大小的TXT文件写入到字符串,一旦读取超过了5M大小。那么就会导致服务UI内存爆满溢出。从而对服务器发送的请求过多。服务器相应不过来就出现这种情况。。。



php中file_get_contents函数怎么读取大容量文件  第3张


   凡事找到了问题的根源。解决办法就不难了。解决步骤如下。

v   一、总结

一句话总结:使用file_get_contents()进行分段读取,file_get_contents()函数可以分段读取

 

1、读取大文件是,file_get_contents()函数为什么会发生错误?

发生内存溢出而打开错误

当我们遇到文本文件体积很大时,比如超过几十M甚至几百M几G的大文件,用记事本或者其它编辑器打开往往不能成功,因为他们都需要把文件内容全部放到内存里面,这时就会发生内存溢出而打开错误

因为file_get_contents()只能读取长度为 maxlen 的内容

 

2、file_get_contents()函数的机制是什么?

file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents() 将返回 FALSE。

 

3、file_get_contents()函数如何读取大文件?

使用file_get_contents()进行分段读取

$str = $content=file_get_contents("2.sql",FALSE,NULL,1024*1024,1024);
echo $str;

 

$u ='www.hepuhua.cn'; //此文件为100GB

$a =file_get_contents( $u,100,1000 );

读取成功了

 

 

4、fread()函数如何分段读取?

其实就是判断文件是否结束,没结束就一直读

$fp=fopen('2.sql','r');
while (!feof($fp)){
$str.=fread($fp, filesize ($filename)/10);//每次读出文件10分之1

 

5、如何设置file_get_contents函数的超时时间?

<?php//设置超时参数$opts=array(        "http"=>array(                "method"=>"GET",                "timeout"=>3
                ),
        );////创建数据流上下文$context = stream_context_create($opts);//$url请求的地址,例如:$result =file_get_contents($url, false, $context);// 打印结果print_r($result);?>

 

二、php 使用file_get_contents读取大文件的方法

当遇到文本文件体积很大时,比如超过几十M甚至几百M几G的大文件,用记事本或者其它编辑器打开往往不能成功,因为这都需要把文件内容全部放到内存里面,这时就会发生内存溢出而打开错误,遇到这种情况可以使用PHP的文件读取函数file_get_contents()进行分段读取

函数说明
string file_get_contents ( string $filename [, bool $use_include_path [, resource $context [, int $offset [, int $maxlen ]]]] )
和 file() 一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents() 将返回 FALSE。

file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。

应用:

代码如下:

$str = $content=file_get_contents("2.sql",FALSE,NULL,1024,1024*1024);
echo $str;

如果针对较小文件只是希望分段读取并以此读完可以使用fread()函数

代码如下:

$fp=fopen('2.sql','r');
while (!feof($fp)){
$str.=fread($fp, filesize ($filename)/10);//每次读出文件10分之1
//进行处理
}

echo $str;

以上就是如何使用file_get_contents函数读取大文件的方法,超级简单吧,需要的小伙伴直接搬走!


php中file_get_contents函数怎么读取大容量文件 第4张

php中file_get_contents函数怎么读取大容量文件 第5张

三、解决php中file_get_contents 读取大文件返回false问题

file_get_contents文件是用来读写文件的,但我发现用file_get_contents 读取大文件出错提示Note: string can be as large as 2GB了,这个就是不能超过2G了,有没有办法解决呢,下面我来一起来看。

如果我读取一个 www.hepuhua.cn文件

 代码如下
复制代码

$u ='www.hepuhua.cn'; //此文件为100GB

$a =file_get_contents( $u );

运行提示

Note: string can be as large as 2GB

不能大于2GB了,我们去官方看此函数参考

string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )

发现有个file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败, file_get_contents() 将返回 FALSE。

原来如此,这样只要对程序进行修改即可

 代码如下
复制代码

$u ='www.hepuhua.cn'; //此文件为100GB

$a =file_get_contents( $u,100,1000 );

读取成功了

总结

file_get_contents如果正常返回,会把文件内容储存到某个字符串中,所以它不应该返回超过2G长度的字符串。

如果文件内容超过2G,不加offset和maxlen调用file_get_contents的话,肯定会返回false,


四、PHP中file_get_contents($url)的超时处理


PHP中file_get_contents函数的作用是获取一个 URL 的返回内容。如果是url响应速度慢,或者网络等因素,会造成等待时间较长的情况。只需设置一下file_get_contents函数的超时时间即可解决。示例代码如下:

<?php//设置超时参数$opts=array(        "http"=>array(                "method"=>"GET",                "timeout"=>3
                ),
        );////创建数据流上下文$context = stream_context_create($opts);//$url请求的地址,例如:$result =file_get_contents($url, false, $context);// 打印结果print_r($result);?>
此篇文章由DurkBlue发布,麻烦转载请注明来处
文章投稿或转载声明

来源:DurkBlue版权归原作者所有,转载请保留出处。本站文章发布于 2020-02-01
温馨提示:文章内容系作者个人观点,不代表DurkBlue博客对其观点赞同或支持。

赞(2)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论取消回复

快捷回复:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog

评论列表 (暂无评论,1853人围观)参与讨论

还没有评论,来说两句吧...