php读取文件内容的几种方法详解


Posted in PHP onJune 26, 2013

示例代码1: 用file_get_contents 以get方式获取内容

<?php
$url='http://www.baidu.com/';
$html=file_get_contents($url);
//print_r($http_response_header);
ec($html);
printhr();
printarr($http_response_header);
printhr();
?>

示例代码2: 用fopen打开url, 以get方式获取内容
<?
$fp=fopen($url,'r');
printarr(stream_get_meta_data($fp));
printhr();
while(!feof($fp)){
$result.=fgets($fp,1024);
}
echo"url body:$result";
printhr();
fclose($fp);
?>

示例代码3:用file_get_contents函数,以post方式获取url
<?php
$data=array('foo'=>'bar');
$data=http_build_query($data);
$opts=array(
 'http'=>array(
'method'=>'POST',
'header'=>"Content-type: application/x-www-form-urlencoded\r\n".
 "Content-Length: ".strlen($data)."\r\n",
'content'=>$data
),
);
$context=stream_context_create($opts);
$html=file_get_contents('http://localhost/e/admin/test.html',false,$context);
echo$html;
?>

示例代码4:用fsockopen函数打开url,以get方式获取完整的数据,包括header和body
<?
functionget_url($url,$cookie=false){
$url=parse_url($url);
$query=$url[path]."?".$url[query];
ec("Query:".$query);
$fp=fsockopen($url[host],$url[port]?$url[port]:80,$errno,$errstr,30);
if(!$fp){
returnfalse;
}else{
$request="GET$queryHTTP/1.1\r\n";
$request.="Host:$url[host]\r\n";
$request.="Connection: Close\r\n";
if($cookie)$request.="Cookie:$cookie\n";
$request.="\r\n";
fwrite($fp,$request);
while(!@feof($fp)){
$result.=@fgets($fp,1024);
}
fclose($fp);
return$result;
}
}
//获取url的html部分,去掉header
functionGetUrlHTML($url,$cookie=false){
$rowdata=get_url($url,$cookie);
if($rowdata)
{
 $body=stristr($rowdata,"\r\n\r\n");
 $body=substr($body,4,strlen($body));
 return$body;
}
returnfalse;
}
?>

示例代码5:用fsockopen函数打开url,以POST方式获取完整的数据,包括header和body
<?
functionHTTP_Post($URL,$data,$cookie,$referrer=""){
// parsing the given URL
$URL_Info=parse_url($URL);
// Building referrer
if($referrer=="")// if not given use this script. as referrer
$referrer="111";
// making string from $data
foreach($dataas$key=>$value)
$values[]="$key=".urlencode($value);
$data_string=implode("&",$values);
// Find out which port is needed - if not given use standard (=80)
if(!isset($URL_Info["port"]))
$URL_Info["port"]=80;
// building POST-request:
$request.="POST ".$URL_Info["path"]." HTTP/1.1\n";
$request.="Host: ".$URL_Info["host"]."\n";
$request.="Referer:$referer\n";
$request.="Content-type: application/x-www-form-urlencoded\n";
$request.="Content-length: ".strlen($data_string)."\n";
$request.="Connection: close\n";
$request.="Cookie:$cookie\n";
$request.="\n";
$request.=$data_string."\n";
$fp=fsockopen($URL_Info["host"],$URL_Info["port"]);
fputs($fp,$request);
while(!feof($fp)){
$result.=fgets($fp,1024);
}
fclose($fp);
return$result;
}
printhr();
?>

示例代码6:使用curl库,使用curl库之前,你可能需要查看一下php.ini,查看是否已经打开了curl扩展
<?
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL, 'http://www.baidu.com/');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
echo $file_contents;
?>

关于curl库:
curl官方网站http://curl.haxx.se/
curl 是使用URL语法的传送文件工具,支持FTP、FTPS、HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP。curl 支持SSL证书、HTTP POST、HTTP PUT 、FTP 上传,kerberos、基于HTT格式的上传、代理、cookie、用户+口令证明、文件传送恢复、http代理通道和大量其他有用的技巧
<?
functionprintarr(array$arr)
{
echo"<br> Row field count: ".count($arr)."<br>";
foreach($arras$key=>$value)
{ 
echo"$key=$value <br>";
}
}
?>

======================================================
PHP抓取远程网站数据的代码
现在可能还有很多程序爱好者都会遇到同样的疑问,就是要如何像搜索引擎那样去抓取别人网站的HTML代码,然后把代码收集整理成为自己有用的数据!今天就等我介绍一些简单例子吧.
Ⅰ.抓取远程网页标题的例子:
以下是代码片段:
<?php
/*
+-------------------------------------------------------------
+抓取网页标题的代码,直接拷贝本代码片段,另存为.php文件执行即可.
+-------------------------------------------------------------
*/
error_reporting(7);
$file = fopen ("http://www.dnsing.com/", "r");
if (!$file) {
echo "<font color=red>Unable to open remote file.</font>\n";
exit;
}
while (!feof ($file)) {
$line = fgets ($file, 1024);
if (eregi ("<title>(.*)</title>", $line, $out)) {
$title = $out[1];
echo "".$title."";
break;
}
}
fclose($file);
//End
?>

Ⅱ.抓取远程网页HTML代码的例子:
以下是代码片段:
<? php
/*
+----------------
+DNSing Sprider
+----------------
*/
$fp = fsockopen("www.dnsing.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br/>\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host:www.dnsing.com\r\n";
$out .= "Connection: Close \r\n\r\n";
fputs($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
//End
?>

以上两个代码片段都直接Copy回去运行就知道效果了,上面的例子只是抓取网页数据的雏形,要使其更适合自己的使用,情况有各异.所以,在此各位程序爱好者自己好好研究一下吧.
===============================
稍微有点意义的函数是:get_content_by_socket(), get_url(), get_content_url(), get_content_object 几个函数,也许能够给你点什么想法。
<?php
//获取所有内容url保存到文件
function get_index($save_file, $prefix="index_"){
$count = 68;
$i = 1;
if (file_exists($save_file)) @unlink($save_file);
$fp = fopen($save_file, "a+") or die("Open ". $save_file ." failed");
while($i<$count){
$url = $prefix . $i .".htm";
echo "Get ". $url ."...";
$url_str = get_content_url(get_url($url));
echo " OK\n";
fwrite($fp, $url_str);
++$i;
}
fclose($fp);
}
//获取目标多媒体对象
function get_object($url_file, $save_file, $split="|--:**:--|"){
if (!file_exists($url_file)) die($url_file ." not exist");
$file_arr = file($url_file);
if (!is_array($file_arr) || empty($file_arr)) die($url_file ." not content");
$url_arr = array_unique($file_arr);
if (file_exists($save_file)) @unlink($save_file);
$fp = fopen($save_file, "a+") or die("Open save file ". $save_file ." failed");
foreach($url_arr as $url){
if (empty($url)) continue;
echo "Get ". $url ."...";
$html_str = get_url($url);
echo $html_str;
echo $url;
exit;
$obj_str = get_content_object($html_str);
echo " OK\n";
fwrite($fp, $obj_str);
}
fclose($fp);
}
//遍历目录获取文件内容
function get_dir($save_file, $dir){
$dp = opendir($dir);
if (file_exists($save_file)) @unlink($save_file);
$fp = fopen($save_file, "a+") or die("Open save file ". $save_file ." failed");
while(($file = readdir($dp)) != false){
if ($file!="." && $file!=".."){
 echo "Read file ". $file ."...";
 $file_content = file_get_contents($dir . $file);
 $obj_str = get_content_object($file_content);
 echo " OK\n";
 fwrite($fp, $obj_str);
}
}
fclose($fp);
}
//获取指定url内容
function get_url($url){
$reg = '/^http:\/\/[^\/].+$/';
if (!preg_match($reg, $url)) die($url ." invalid");
$fp = fopen($url, "r") or die("Open url: ". $url ." failed.");
while($fc = fread($fp, 8192)){
$content .= $fc;
}
fclose($fp);
if (empty($content)){
die("Get url: ". $url ." content failed.");
}
return $content;
}
//使用socket获取指定网页
function get_content_by_socket($url, $host){
$fp = fsockopen($host, 80) or die("Open ". $url ." failed");
$header = "GET /".$url ." HTTP/1.1\r\n";
$header .= "Accept: */*\r\n";
$header .= "Accept-Language: zh-cn\r\n";
$header .= "Accept-Encoding: gzip, deflate\r\n";
$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1; .NET CLR 2.0.50727)\r\n";
$header .= "Host: ". $host ."\r\n";
$header .= "Connection: Keep-Alive\r\n";
//$header .= "Cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-\r\n\r\n";
$header .= "Connection: Close\r\n\r\n";
fwrite($fp, $header);
while (!feof($fp)) {
$contents .= fgets($fp, 8192);
}
fclose($fp);
return $contents;
}
//获取指定内容里的url
function get_content_url($host_url, $file_contents){
//$reg = '/^(#|javascript.*?|ftp:\/\/.+|http:\/\/.+|.*?href.*?|play.*?|index.*?|.*?asp)+$/i';
//$reg = '/^(down.*?\.html|\d+_\d+\.htm.*?)$/i';
$rex = "/([hH][rR][eE][Ff])\s*=\s*['\"]*([^>'\"\s]+)[\"'>]*\s*/i";
$reg = '/^(down.*?\.html)$/i';
preg_match_all ($rex, $file_contents, $r);
$result = ""; //array();
foreach($r as $c){
if (is_array($c)){
 foreach($c as $d){
if (preg_match($reg, $d)){ $result .= $host_url . $d."\n"; }
 }
}
}
return $result;
}
//获取指定内容中的多媒体文件
function get_content_object($str, $split="|--:**:--|"){ 
$regx = "/href\s*=\s*['\"]*([^>'\"\s]+)[\"'>]*\s*(<b>.*?<\/b>)/i";
preg_match_all($regx, $str, $result);
if (count($result) == 3){
$result[2] = str_replace("<b>多媒体: ", "", $result[2]);
$result[2] = str_replace("</b>", "", $result[2]);
$result = $result[1][0] . $split .$result[2][0] . "\n";
}
return $result;
}
?>

======================================================
同一域名对应多个IP时,PHP获取远程网页内容的函数
fgc就是简单的读取过来,把一切操作封装了
fopen也进行了一些封装,但是需要你循环读取得到所有数据。
fsockopen这是直板板的socket操作。
如果仅仅是读取一个html页面,fgc更好。
如果公司是通过防火墙上网,一 般的file_get_content函数就不行了。当然,通过一些socket操作,直接向proxy写http请求也是可以的,但是比较麻烦。
如果你能确认文件很小,可以任选以上两种方式fopen ,join('',file($file));。比如,你只操作小于1k的文件,那最好还是用file_get_contents吧。
如果确定文件很大,或者不能确定文件的大小,那就最好使用文件流了。fopen一个1K的文件和fopen一个1G的文件没什么明显的区别。内容长,就可以花更长的时间去读,而不是让脚本死掉。
----------------------------------------------------
http://www.phpcake.cn/archives/tag/fsockopen
PHP获取远程网页内容有多种方式,例如用自带的file_get_contents、fopen等函数。
<?php 
echo file_get_contents("http://blog.s135.com/abc.php");
?>

但是,在DNS轮询等负载均衡中,同一域名,可能对应多台服务器,多个IP。假设blog.s135.com被DNS解析到 72.249.146.213、72.249.146.214、72.249.146.215三个IP,用户每次访问blog.s135.com,系统会根据负载均衡的相应算法访问其中的一台服务器。
上周做一个视频项目时,就碰到这样一类需求:需要依次访问每台服务器上的一个PHP接口程序(假设为abc.php),查询这台服务器的传输状态。
这时就不能直接用file_get_contents访问http://blog.s135.com/abc.php了,因为它可能一直重复访问某一台服务器。
而采用依次访问http://72.249.146.213/abc.php、http://72.249.146.214/abc.php、http://72.249.146.215/abc.php的方法,在这三台服务器上的Web Server配有多个虚拟主机时,也是不行的。
通过设置本地hosts也不行,因为hosts不能设置多个IP对应同一个域名。
那就只有通过PHP和HTTP协议来实现:访问abc.php时,在header头中加上blog.s135.com域名。于是,我写了下面这个PHP函数:
<?php
 /************************
 * 函数用途:同一域名对应多个IP时,获取指定服务器的远程网页内容
 * 参数说明:
 * $ip服务器的IP地址
 * $host服务器的host名称
 * $url服务器的URL地址(不含域名)
 * 返回值:
 * 获取到的远程网页内容
 * false访问远程网页失败
 ************************/
 function HttpVisit($ip, $host, $url) 
 { 
$errstr = ''; 
$errno = ''; 
$fp = fsockopen ($ip, 80, $errno, $errstr, 90); 
if (!$fp) 
{ 
 return false; 
} 
else
{ 
$out = "GET {$url} HTTP/1.1\r\n"; 
$out .= "Host:{$host}\r\n"; 
$out .= "Connection: close\r\n\r\n"; 
fputs ($fp, $out);
while($line = fread($fp, 4096)){ 
$response .= $line; 
} 
fclose( $fp );
//去掉Header头信息
$pos = strpos($response, "\r\n\r\n"); 
$response = substr($response, $pos + 4);
return $response; 
} 
 }
 //调用方法:
 $server_info1 = HttpVisit("72.249.146.213", "blog.s135.com", "/abc.php"); 
 $server_info2 = HttpVisit("72.249.146.214", "blog.s135.com", "/abc.php"); 
 $server_info3 = HttpVisit("72.249.146.215", "blog.s135.com", "/abc.php"); 
 ?>
PHP 相关文章推荐
用PHP产生动态的影像图
Oct 09 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
Nov 07 PHP
通达OA公共代码 php常用检测函数
Dec 14 PHP
table标签的结构与合并单元格的实现方法
Jul 24 PHP
PHP中time(),date(),mktime()区别介绍
Sep 28 PHP
如何用PHP来实现一个动态Web服务器
Jul 29 PHP
使用PHPCMS搭建wap手机网站
Sep 20 PHP
mysql alter table命令修改表结构实例详解
Sep 24 PHP
PHP Mysqli 常用代码集合
Nov 12 PHP
laravel 实现用户登录注销并限制功能
Oct 24 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
PHP预定义接口――Iterator用法示例
Jun 05 PHP
深入file_get_contents与curl函数的详解
Jun 25 #PHP
解析如何去掉CodeIgniter URL中的index.php
Jun 25 #PHP
解析php入库和出库
Jun 25 #PHP
解析php下载远程图片函数 可伪造来路
Jun 25 #PHP
解析php通过cookies获取远程网页的指定代码
Jun 25 #PHP
使用dump函数,给php加断点测试
Jun 25 #PHP
解析php多线程下载远程多个文件
Jun 25 #PHP
You might like
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
PHP文件上传类实例详解
2016/04/08 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
禁止你的左键复制实用技巧
2013/01/04 Javascript
jquery对象和DOM对象的区别介绍
2013/08/09 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
nodejs之koa2请求示例(GET,POST)
2018/08/07 NodeJs
js canvas实现五子棋小游戏
2021/01/22 Javascript
用python删除java文件头上版权信息的方法
2014/07/31 Python
python实现简单爬虫功能的示例
2016/10/24 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
2020/03/28 Python
python编写一个会算账的脚本的示例代码
2020/06/02 Python
python Gabor滤波器讲解
2020/10/26 Python
CSS3中Transform动画属性用法详解
2016/07/04 HTML / CSS
Canvas 文本填充线性渐变的使用详解
2020/06/22 HTML / CSS
英国鲜花递送:Blossoming Gifts
2020/07/10 全球购物
高中毕业自我评价
2014/02/08 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
家长评语怎么写
2014/12/30 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
新员工入职感言范文!
2019/07/04 职场文书
在pycharm中无法import所安装的库解决方案
2021/05/31 Python
linux下安装redis图文详细步骤
2021/12/04 Redis