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面向对象编程快速入门
Oct 09 PHP
php curl 伪造IP来源的实例代码
Nov 01 PHP
easyui的tabs update正确用法分享
Mar 21 PHP
kohana框架上传文件验证规则写法示例
Jul 14 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
Nov 17 PHP
PHP实现在线阅读PDF文件的方法
Jun 23 PHP
php通过文件头判断格式的方法
May 28 PHP
PHP微信支付开发实例
Jun 22 PHP
PHP后台微信支付和支付宝支付开发
Apr 28 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
May 08 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
Apr 13 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使用正则表达式获取图片url的方法
2015/01/16 PHP
CI框架中redis缓存相关操作文件示例代码
2016/05/17 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
js中格式化日期时间型数据函数代码
2010/11/08 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
密码框显示提示文字jquery示例
2013/08/29 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
python异常和文件处理机制详解
2016/07/19 Python
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
python3.5基于TCP实现文件传输
2020/03/20 Python
python实现Zabbix-API监控
2018/09/17 Python
python中如何实现将数据分成训练集与测试集的方法
2019/09/13 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
小学师德标兵先进事迹材料
2014/05/25 职场文书
影视广告专业求职信
2014/09/02 职场文书
2014年超市工作总结
2014/11/19 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书