熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

php讀取文件內容的幾種方法詳解

2013-11-15 12:27:06  來源: PHP編程 

  示例代碼: 用file_get_contents 以get方式獲取內容

復制代碼 代碼如下:
<?php
$url=;
$html=file_get_contents($url);
//print_r($http_response_header);
ec($html);
printhr();
printarr($http_response_header);
printhr();
?>

  
示例代碼: 用fopen打開url 以get方式獲取內容

復制代碼 代碼如下:
<?
$fp=fopen($urlr);
printarr(stream_get_meta_data($fp));
printhr();
while(!feof($fp)){
$result=fgets($fp);
}
echo"url body:$result";
printhr();
fclose($fp);
?>

  
示例代碼用file_get_contents函數以post方式獲取url

復制代碼 代碼如下:
<?php
$data=array(foo=>bar);
$data=http_build_query($data);
$opts=array(
http=>array(
method=>POST
header=>"Contenttype: application/xwwwformurlencodedrn"
"ContentLength: "strlen($data)"rn"
content=>$data
)
);
$context=stream_context_create($opts);
$html=file_get_contents(false$context);
echo$html;
?>

  
示例代碼用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]:$errno$errstr);
if(!$fp){
returnfalse;
}else{
$request="GET$queryHTTP/rn";
$request="Host:$url[host]rn";
$request="Connection: Closern";
if($cookie)$request="Cookie:$cookien";
$request="rn";
fwrite($fp$request);
while(!@feof($fp)){
$result=@fgets($fp);
}
fclose($fp);
return$result;
}
}
//獲取url的html部分去掉header
functionGetUrlHTML($url$cookie=false){
$rowdata=get_url($url$cookie);
if($rowdata)
{
$body=stristr($rowdata"rnrn");
$body=substr($bodystrlen($body));
return$body;
}
returnfalse;
}
?>

  
示例代碼用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="";
// 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 (=)
if(!isset($URL_Info["port"]))
$URL_Info["port"]=;
// building POSTrequest:
$request="POST "$URL_Info["path"]" HTTP/n";
$request="Host: "$URL_Info["host"]"n";
$request="Referer:$referern";
$request="Contenttype: application/xwwwformurlencodedn";
$request="Contentlength: "strlen($data_string)"n";
$request="Connection: closen";
$request="Cookie:$cookien";
$request="n";
$request=$data_string"n";
$fp=fsockopen($URL_Info["host"]$URL_Info["port"]);
fputs($fp$request);
while(!feof($fp)){
$result=fgets($fp);
}
fclose($fp);
return$result;
}
printhr();
?>

  
示例代碼:使用curl庫使用curl庫之前你可能需要查看一下phpini查看是否已經打開了curl擴展

復制代碼 代碼如下:
<?
$ch = curl_init();
$timeout = ;
curl_setopt ($ch CURLOPT_URL );
curl_setopt ($ch CURLOPT_RETURNTRANSFER );
curl_setopt ($ch CURLOPT_CONNECTTIMEOUT $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
echo $file_contents;
?>

  
關於curl庫
curl官方網站
curl 是使用URL語法的傳送文件工具支持FTPFTPSHTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAPcurl 支持SSL證書HTTP POSTHTTP 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();
$file = fopen (" "r");
if (!$file) {
echo "<font color=red>Unable to open remote file</font>n";
exit;
}
while (!feof ($file)) {
$line = fgets ($file );
if (eregi ("<title>(*)</title>" $line $out)) {
$title = $out[];
echo ""$title"";
break;
}
}
fclose($file);
//End
?>

  
抓取遠程網頁HTML代碼的例子:
以下是代碼片段

復制代碼 代碼如下:
<? php
/*
+
+DNSing Sprider
+
*/
$fp = fsockopen("wwwdnsingcom" $errno $errstr );
if (!$fp) {
echo "$errstr ($errno)<br/>n";
} else {
$out = "GET / HTTP/rn";
$out = "Host:wwwdnsingcomrn";
$out = "Connection: Close rnrn";
fputs($fp $out);
while (!feof($fp)) {
echo fgets($fp );
}
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 = ;
$i = ;
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 " OKn";
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 " OKn";
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 " OKn";
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 )){
$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 ) or die("Open " $url " failed");
$header = "GET /"$url " HTTP/rn";
$header = "Accept: */*rn";
$header = "AcceptLanguage: zhcnrn";
$header = "AcceptEncoding: gzip deflatern";
$header = "UserAgent: Mozilla/ (compatible; MSIE ; Windows NT ; SV; Maxthon; InfoPath; NET CLR )rn";
$header = "Host: " $host "rn";
$header = "Connection: KeepAlivern";
//$header = "Cookie: cnzz=; rtime=; ltime=; cnzz_eid=rnrn";
$header = "Connection: Closernrn";
fwrite($fp $header);
while (!feof($fp)) {
$contents = fgets($fp );
}
fclose($fp);
return $contents;
}
//獲取指定內容裡的url
function get_content_url($host_url $file_contents){
//$reg = /^(#|javascript*?|ftp://+|+|*?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 = "/hrefs*=s*["]*([^>"s]+)[">]*s*(<b>*?</b>)/i";
preg_match_all($regx $str $result);
if (count($result) == ){
$result[] = str_replace("<b>多媒體 " "" $result[]);
$result[] = str_replace("</b>" "" $result[]);
$result = $result[][] $split $result[][] "n";
}
return $result;
}
?>

  
======================================================
同一域名對應多個IP時PHP獲取遠程網頁內容的函數
fgc就是簡單的讀取過來把一切操作封裝了
fopen也進行了一些封裝但是需要你循環讀取得到所有數據
fsockopen這是直板板的socket操作
如果僅僅是讀取一個html頁面fgc更好
如果公司是通過防火牆上網一 般的file_get_content函數就不行了當然通過一些socket操作直接向proxy寫http請求也是可以的但是比較麻煩
如果你能確認文件很小可以任選以上兩種方式fopen join(file($file));比如你只操作小於k的文件那最好還是用file_get_contents吧
如果確定文件很大或者不能確定文件的大小那就最好使用文件流了fopen一個K的文件和fopen一個G的文件沒什麼明顯的區別內容長就可以花更長的時間去讀而不是讓腳本死掉


PHP獲取遠程網頁內容有多種方式例如用自帶的file_get_contentsfopen等函數

復制代碼 代碼如下:
<?php
echo file_get_contents("
?>

  
但 是在DNS輪詢等負載均衡中同一域名可能對應多台服務器多個IP假設blogscom被DNS解析到 三個IP用戶每次訪問blogscom系統會 根據負載均衡的相應算法訪問其中的一台服務器
上周做一個視頻項目時就碰到這樣一類需求需要依次訪問每台服務器上的一個PHP接口程序(假設為abcphp)查詢這台服務器的傳輸狀態
這時就不能直接用file_get_contents訪問了因為它可能一直重復訪問某一台服務器
而 采用依次訪問的方法在這三台服務器上的Web Server配有多個虛擬主機時也是不行的
通過設置本地hosts也不行因為hosts不能設置多個IP對應同一個域名
那就只有通過PHP和HTTP協議來實現訪問abcphp時在header頭中加上blogscom域名於是我寫了下面這個PHP函數

復制代碼 代碼如下:

  
<?php
/************************
* 函數用途同一域名對應多個IP時獲取指定服務器的遠程網頁內容
* 參數說明
* $ip服務器的IP地址
* $host服務器的host名稱
* $url服務器的URL地址(不含域名)
* 返回值
* 獲取到的遠程網頁內容
* false訪問遠程網頁失敗
************************/
function HttpVisit($ip $host $url)
{
$errstr = ;
$errno = ;
$fp = fsockopen ($ip $errno $errstr );
if (!$fp)
{
return false;
}
else
{
$out = "GET {$url} HTTP/rn";
$out = "Host:{$host}rn";
$out = "Connection: closernrn";
fputs ($fp $out);

  while($line = fread($fp )){
$response = $line;
}
fclose( $fp );

  //去掉Header頭信息
$pos = strpos($response "rnrn");
$response = substr($response $pos + );

  return $response;
}
}

  //調用方法
$server_info = HttpVisit("" "blogscom" "/abcphp");
$server_info = HttpVisit("" "blogscom" "/abcphp");
$server_info = HttpVisit("" "blogscom" "/abcphp");
?>


From:http://tw.wingwit.com/Article/program/PHP/201311/20975.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.