file_get_contents() 把整个文件读入一个字符串中。
该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
类似函数:fopen() 函数打开一个文件或 URL。区别是fopen()打开网页后,返回的不是字符串,不能直输出的,还需要用到fgets()这个函数来获取字符串。fgets()函数是从文件指针中读取一行。文件指针必须是有效的,必须指向由 fopen() 或 fsockopen() 成功打开的文件(并还未由 fclose() 关闭)。
相关函数:file_put_contents() 函数把一个字符串写入文件中。
参数 | 描述 |
---|---|
path | 必需。规定要读取的文件,或者url。 |
include_path | 可选。如果您还想在 include_path(在 php.ini 中)中搜索文件的话,请设置该参数为 '1'。 |
context | 可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 NULL,则忽略。 |
start | 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 中新增的。 |
max_length | 可选。规定读取的字节数。该参数是 PHP 5.1 中新增的。 |
提示:该函数是二进制安全的。(意思是二进制数据(如图像)和字符数据都可以使用此函数写入。)
上面的代码将输出:
获取某个网址页面的源代码也可以使用file_get_contents() 函数
<?php
$pagecontent = file_get_contents("http://www.sxiaw.com");
echo $pagecontent;
?>
上面的代码将输出:
http://www.sxiaw.com地址所对应的源代码
Note:
如果要打开有特殊字符的 URL (比如说有空格),就需要使用 urlencode() 进行 URL 编码。
在使用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、超过几秒就重新执行,多次重试直到成功
$cnt=0;
while($cnt < 3 && ($str=@file_get_contents('http://www.sxiaw.com'))===FALSE) $cnt++;
注意:如果执行时间过长,还需要用函数set_time_limit(0);就不会超时了。
$context = array(
'http' => array(
'proxy' => 'tcp://192.168.0.1:3128', //这里设置你要使用的代理ip及端口号
'request_fulluri' => true,
),
);
$context = stream_context_create($context);
$html = file_get_contents("http://www.sxiaw.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("http://www.sxiaw.com/archives/806/", false, $context);
echo $html;