PHP file_get_contents() 函数
定义和用法
file_get_contents() 把整个文件读入一个字符串中。
该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
类似函数:fopen() 函数打开一个文件或 URL。区别是fopen()打开网页后,返回的不是字符串,不能直输出的,还需要用到fgets()这个函数来获取字符串。fgets()函数是从文件指针中读取一行。文件指针必须是有效的,必须指向由 fopen() 或 fsockopen() 成功打开的文件(并还未由 fclose() 关闭)。
相关函数:file_put_contents() 函数把一个字符串写入文件中。
语法
file_get_contents(path,include_path,context,start,max_length)
参数 | 描述 |
---|---|
path | 必需。规定要读取的文件,或者url。 |
include_path | 可选。如果您还想在 include_path(在 php.ini 中)中搜索文件的话,请设置该参数为 '1'。 |
context | 可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 NULL,则忽略。 |
start | 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 中新增的。 |
max_length | 可选。规定读取的字节数。该参数是 PHP 5.1 中新增的。 |
提示和注释
提示:该函数是二进制安全的。(意思是二进制数据(如图像)和字符数据都可以使用此函数写入。)
实例
<?php echo file_get_contents("test.txt"); ?>
上面的代码将输出:
This is a test file with test text.
实例2
获取某个网址页面的源代码也可以使用file_get_contents() 函数
<?php $pagecontent = file_get_contents("https://www.ancii.com"); echo $pagecontent; ?>
上面的代码将输出:
https://www.ancii.com地址所对应的源代码
Note:
如果要打开有特殊字符的 URL (比如说有空格),就需要使用 urlencode() 进行 URL 编码。
file_get_contents函数超时处理
在使用file_get_contents函数读取文件或URL的时候,经常会出现超时的情况,我们可以通过一些方法来尽量的避免或者解决。
1、增加超时的时间限制
这里需要注意:set_time_limit(0)只是设置你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时间。
想通过set_time_limit(0)影响到file_get_contents来增加超时时间,经测试,是无效的。真正的修改file_get_contents延时可以用resource $context的timeout参数,timeout参数的单位是s(秒)。
实例:
$opts = array( 'http'=>array( 'method'=>"GET", 'timeout'=>30, ) ); $html = file_get_contents('http://www.example.com', false, stream_context_create($opts));
2、超过几秒就重新执行,多次重试直到成功
file_get_contents超时有时候失败是因为网络等因素造成,没有解决办法,但是可以修改程序,失败时重试几次,仍然失败就放弃,因为file_get_contents()如果失败将返回 FALSE,所以可以下面这样编写代码:
$cnt=0; while($cnt < 3 && ($str=@file_get_contents('https://www.ancii.com'))===FALSE) $cnt++;
注意:如果执行时间过长,还需要用函数set_time_limit(0);就不会超时了。
file_get_contents函数代理设置处理
设置代理IP去获取页面数据
$context = array( 'http' => array( 'proxy' => 'tcp://192.168.0.1:3128', //这里设置你要使用的代理ip及端口号 'request_fulluri' => true, ), ); $context = stream_context_create($context); $html = file_get_contents("https://www.ancii.com/archives/806/", false, $context); echo $html;设置需要验证的代理IP去采集获取页面数据
$auth = base64_encode('USER:PASS'); //LOGIN:PASSWORD 这里是代理服务器的账户名及密码 $context = array( 'http' => array( 'proxy' => 'tcp://192.168.0.1:3128', //这里设置你要使用的代理ip及端口号 'request_fulluri' => true, 'header' => "Proxy-Authorization: Basic $auth", ), ); $context = stream_context_create($context); $html = file_get_contents("https://www.ancii.com/archives/806/", false, $context); echo $html;