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的输入输出流
Feb 14 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
Jun 20 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
Laravel实现构造函数自动依赖注入的方法
Mar 16 PHP
PHP获取网站中各文章的第一张图片的代码示例
May 20 PHP
PHP中explode函数和split函数的区别小结
Aug 24 PHP
PHP 7.1新特性的汇总介绍
Dec 16 PHP
PHP获取链表中倒数第K个节点的方法
Jan 18 PHP
PHP 多任务秒级定时器的实现方法
May 13 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
Jul 24 PHP
浅析PHP中json_encode与json_decode的区别
Jul 15 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
php简单操作mysql数据库的类
2015/04/16 PHP
PHP中overload与override的区别
2017/02/13 PHP
php异常处理捕获错误整理
2019/09/23 PHP
jquery validation插件表单验证的一个例子
2010/03/03 Javascript
基于node.js的快速开发透明代理
2010/12/25 Javascript
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
Angular用来控制元素的展示与否的原生指令介绍
2015/01/07 Javascript
jQuery插件StickUp实现网页导航置顶
2015/04/12 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
HTML Table 空白单元格补全的简单实现
2016/10/13 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
2017/06/12 jQuery
在vue项目中安装使用Mint-UI的方法
2017/12/27 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
2018/10/20 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
如何获取vue单文件自身源码路径
2019/05/06 Javascript
elementUI 动态生成几行几列的方法示例
2019/07/11 Javascript
基于Express框架使用POST传递Form数据
2019/08/10 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
python获取本机外网ip的方法
2015/04/15 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
Python中文件的读取和写入操作
2018/04/27 Python
对python中的argv和argc使用详解
2018/12/15 Python
CSS中的字体大小设置属性总结
2016/05/24 HTML / CSS
工厂门卫岗位职责
2013/11/25 职场文书
大学生开西餐厅创业计划书
2014/02/01 职场文书
春风行动实施方案
2014/03/28 职场文书
书香校园建设方案
2014/05/02 职场文书
2014年群众路线党员自我评议
2014/09/24 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
Python制作动态字符画的源码
2021/08/04 Python