php 调用远程url的六种方法小结


Posted in PHP onNovember 02, 2009

示例代码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 ("https://3water.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://img.3water.com/abc.php");
?>
 但是,在DNS轮询等负载均衡中,同一域名,可能对应多台服务器,多个IP。假设img.3water.com被DNS解析到 72.249.146.213、72.249.146.214、72.249.146.215三个IP,用户每次访问img.3water.com,系统会根据负载均衡的相应算法访问其中的一台服务器。

上周做一个视频项目时,就碰到这样一类需求:需要依次访问每台服务器上的一个PHP接口程序(假设为abc.php),查询这台服务器的传输状态。

这时就不能直接用file_get_contents访问http://img.3water.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头中加上img.3water.com域名。于是,我写了下面这个PHP函数:

<?php /************************ 
* 函数用途:同一域名对应多个IP时,获取指定服务器的远程网页内容 
* 创建时间:2008-12-09 
* 创建人:张宴(img.3water.com) 
* 参数说明: 
* $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", "img.3water.com", "/abc.php"); 
$server_info2 = HttpVisit("72.249.146.214", "img.3water.com", "/abc.php"); 
$server_info3 = HttpVisit("72.249.146.215", "img.3water.com", "/abc.php"); 
?>
PHP 相关文章推荐
PHP高自定义性安全验证码代码
Nov 27 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
Feb 22 PHP
PHP goto语句简介和使用实例
Mar 11 PHP
浅谈thinkphp的实例化模型
Jan 04 PHP
php创建多级目录的方法
Mar 24 PHP
php实现比较两个文件夹异同的方法
Jun 18 PHP
Yii2实现同时搜索多个字段的方法
Aug 10 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
Sep 19 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
php 如何设置一个严格控制过期时间的session
May 05 PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 PHP
PHP实现获取url地址中顶级域名的方法示例
Jun 05 PHP
PHP 程序员应该使用的10个组件
Oct 31 #PHP
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
Oct 31 #PHP
php UTF8 文件的签名问题
Oct 30 #PHP
PHP+MySQL 手工注入语句大全 推荐
Oct 30 #PHP
php 攻击方法之谈php+mysql注射语句构造
Oct 30 #PHP
PHP 文件上传源码分析(RFC1867)
Oct 30 #PHP
浅谈PHP 闭包特性在实际应用中的问题
Oct 30 #PHP
You might like
PHP校验ISBN码的函数代码
2011/01/17 PHP
第七章 php自定义函数实现代码
2011/12/30 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
Javascript 面向对象之重载
2010/05/04 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
2012/08/01 Javascript
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
2013/08/14 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
js手机号批量滚动抽奖实现代码
2020/04/17 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
python实现在目录中查找指定文件的方法
2014/11/11 Python
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
详解Django的CSRF认证实现
2018/10/09 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
Python多进程编程常用方法解析
2020/03/26 Python
python pandas.DataFrame.loc函数使用详解
2020/03/26 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
python如何操作mysql
2020/08/17 Python
Python文件操作及内置函数flush原理解析
2020/10/13 Python
Python模块常用四种安装方式
2020/10/20 Python
个人求职简历的自我评价范文
2013/10/09 职场文书
英语硕士生求职简历的自我评价
2013/10/15 职场文书
会计自荐信范文
2014/03/09 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
防火标语大全
2014/10/06 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
表扬信范文
2015/05/04 职场文书
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS