PHP下打开URL地址的几种方法小结


Posted in PHP onMay 16, 2010

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" . 
"Content-Length: " . strlen($data) . "", 
'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
<? 
function get_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) { 
return false; 
} else { 
$request = "GET $query HTTP/1.1"; 
$request .= "Host: $url[host]"; 
$request .= "Connection: Close"; 
if($cookie) $request.="Cookie: $cookie\n"; 
$request.=""; 
fwrite($fp,$request); 
while(!@feof($fp)) { 
$result .= @fgets($fp, 1024); 
} 
fclose($fp); 
return $result; 
} 
} 
//获取url的html部分,去掉header 
function GetUrlHTML($url,$cookie=false) { 
$rowdata = get_url($url,$cookie); 
if($rowdata) 
{ 
$body= stristr($rowdata,""); 
$body=substr($body,4,strlen($body)); 
return $body; 
} 
return false; 
} ?>

示例代码5:用fsockopen函数打开url,以POST方式获取完整的数据,包括header和body
<? 
function HTTP_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($data as $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代理通道和大量其他有用的技巧
<? 
function printarr(array $arr) 
{ 
echo "<br> Row field count: ".count($arr)."<br>"; 
foreach($arr as $key=>$value) 
{ 
echo "$key=$value <br>"; 
} 
} 
?>

7.
有些主机服务商把php的allow_url_fopen选项是关闭了,就是没法直接使用file_get_contents来获取远程web页面的内容。那就是可以使用另外一个函数curl。
下面是file_get_contents和curl两个函数同样功能的不同写法
file_get_contents函数的使用示例:
< ?php 
$file_contents = file_get_contents('http://www.ccvita.com/'); 
echo $file_contents; 
?>

换成curl函数的使用示例:
< ?php 
$ch = curl_init(); 
$timeout = 5; 
curl_setopt ($ch, CURLOPT_URL, 'http://www.ccvita.com'); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
$file_contents = curl_exec($ch); 
curl_close($ch); 
echo $file_contents; 
?>

利用function_exists函数来判断php是否支持一个函数可以轻松写出下面函数
< ?php 
function vita_get_url_content($url) { 
if(function_exists('file_get_contents')) { 
$file_contents = file_get_contents($url); 
} else { 
$ch = curl_init(); 
$timeout = 5; 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
$file_contents = curl_exec($ch); 
curl_close($ch); 
} 
return $file_contents; 
} 
?>

其实上面的这个函数还有待商榷,如果你的主机服务商把file_get_contents和curl都关闭了,上面的函数就会出现错误。
PHP 相关文章推荐
上传多个文件的PHP脚本
Nov 26 PHP
php 删除cookie和浏览器重定向
Mar 16 PHP
php中函数的形参与实参的问题说明
Sep 01 PHP
PHP安全技术之 实现php基本安全
Sep 04 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
Mar 25 PHP
PHP6连接SQLServer2005的三部曲
Apr 15 PHP
PHP在线打包下载功能示例
Oct 15 PHP
php 实现一个字符串加密解密的函数实例代码
Nov 01 PHP
PHP检查URL包含特定字符串实例方法
Feb 11 PHP
掌握PHP垃圾回收机制详解
Mar 13 PHP
PHP多进程简单实例小结
Nov 09 PHP
用Laravel轻松处理千万级数据的方法实现
Dec 25 PHP
让PHP支持断点续传的源码
May 16 #PHP
php 获取一个月第一天与最后一天的代码
May 16 #PHP
PHP 缓存实现代码及详细注释
May 16 #PHP
PHP 防恶意刷新实现代码
May 16 #PHP
PHP 全角转半角实现代码
May 16 #PHP
php5.3 废弃函数小结
May 16 #PHP
memcached 和 mysql 主从环境下php开发代码详解
May 16 #PHP
You might like
一个PHP+MSSQL分页的例子
2006/10/09 PHP
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
php简单日历函数
2015/10/28 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
Jquery 表格合并的问题分享
2011/09/17 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
2016/06/01 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
vue实现文字加密功能
2019/09/27 Javascript
使用Python来开发Markdown脚本扩展的实例分享
2016/03/04 Python
Python图像处理之识别图像中的文字(实例讲解)
2018/05/10 Python
selenium+python自动化测试之多窗口切换
2019/01/23 Python
三步实现Django Paginator分页的方法
2019/06/11 Python
python+jinja2实现接口数据批量生成工具
2019/08/28 Python
python机器学习实现决策树
2019/11/11 Python
python 列表推导和生成器表达式的使用
2021/02/01 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
博朗(Braun)俄罗斯官方商店:德国小家电品牌
2019/09/24 全球购物
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
土木工程专业个人求职信
2013/12/05 职场文书
行政人事岗位职责
2014/03/17 职场文书
公司内部升职自荐信
2015/03/27 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
学校少先队工作总结
2015/08/12 职场文书
校园广播稿范文
2015/08/19 职场文书
工伤调解协议书
2016/03/21 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android
 Redis 串行生成顺序编码的方法实现
2022/04/03 Redis
python通过新建环境安装tfx的问题
2022/05/20 Python