PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 » PHP中高级 » 用php实现proxy功能的示范
本页主题: 用php实现proxy功能的示范 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

自由的龙

该用户目前不在线
级别: 中级程序员
精华: 1
发帖: 1264
威望: 1267 点
金钱: 12660 PYMB
贡献值: 0 点
在线时间:0(小时)
注册时间:2006-04-16
最后登录:2006-06-27

用php实现proxy功能的示范


刚刚写的练手的作品。感觉还是有些实用价值的。。放出来给大家试试。
功能:通过php实现代理功能
适用用户:在家下载较慢。且懒得找proxy。且有高速主机,且主机有php,且主机支持socket。
使用方法:
1。把本程序传到主机上
2。通过浏览器浏览主机上的此文件
3。在url中填入欲下载的文件地址(如果有必要,可以填入referer)
4。点击get proxy url
5。新打开的页面中的链接即为通过proxy下载的链接

注意:
1。支持多线程下载
2。仅支持http协议
3。不支持服务器端header重定向
4。不支持http auth
5。下载较大的文件,可以修改程序中set_time_limit的值,以减少断线的现象(默认为180,即3分钟)
2。url和referer必须采用完整形式填入(如http://www.example.com/xxx.yyy


CODE:[Copy to clipboard]<?php
/***************************************/
/*                         */
/*   Php Http Proxy             */
/*   version: 0.0.1             */
/*   last modify: 2005.1.11       */
/*   author: q3boy<q3boy@sina.com>   */
/*                         */
/***************************************/
set_time_limit(180);
if(sizeof($_GET)) {
  $strGetArrayName = '_GET';
}elseif(sizeof($HTTP_GET_VARS)) {
  $strGetArrayName = 'HTTP_GET_VARS';
//print home page
}else {
  die('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html">
<title>PhpHttpProxy</title>
<style type="text/css">
<!--body,td {font-family: verdana; font-size: 12px;}th,input {font-family: verdana;}-->
</style>
</head>
<body>
<form name="form1" method="get" action="'.$_SERVER['PHP_SELF'].'">
  <table width="500" border="1" align="center" cellpadding="5" cellspacing="1">
    <tr>
        <th colspan="2">PhpHttpProxy</th>
    </tr>
    <tr>
        <td width="39" nowrap>URL:</td>
        <td width="432"><input name="u" type="text" id="u" size="60"></td>
    </tr>
    <tr>
        <td nowrap>REFERER:</td>
        <td><input name="r" type="text" id="r" size="60"></td>
    </tr>
    <tr>
        <td colspan="2" align="center"><input name="act" value="make" type="hidden">
          <input type="submit" value="Get Proxy Url">
          <input type="reset" value="Reset"></td>
    </tr>
  </table>
</form>
</body>
</html>');

}
//get url
$strUrl = trim(${$strGetArrayName}['u']);
if($strUrl=='') {
  die('error occur, url is not be defined.');
}
//get referer
$strRefTmp = ${$strGetArrayName}['r'];
if($strRefTmp!='') {
  $strRef = $strRefTmp;
}elseif(getenv("HTTP_REFERER")!='') {
  $strRef = getenv("HTTP_REFERER");
}else {
  $strRef = '';
}
//url verify & parse
$arrUrl = parse_url($strUrl);
if(!sizeof($arrUrl)) {
  die('error occur, url is not correct');
}
//protocol check
if($arrUrl['scheme']=='http') {
}else {
  die('in this version, '.$arrUrl['scheme'].' protocol has not been support.');
}
//echo url for download
if(${$strGetArrayName}['act']=='make') {
  $strUrl = "http://".getenv("HTTP_HOST").$_SERVER['PHP_SELF']."?u=".urlencode($strUrl)."&r=".urlencode($strRef);
  die("<center><h4><a href='$strUrl'>Click here to download the file by PhpHttpProxy.</a></h2></center>");
}

//get uri
$arrUrl['uri'] = ($arrUrl['path']?$arrUrl['path']:'') . ($arrUrl['query']?'?'.$arrUrl['query']:'') . ($arrUrl['fragment']?'#'.$arrUrl['fragment']:'');
//get filename
$arrUrl['filename'] = basename($arrUrl['path']);
if($arrUrl['filename']=='') {
  $arrUrl['filename']='index.html';
}
//set default port
if(!$arrUrl['port']) {
  if($arrUrl['scheme']=='http') {
    $arrUrl['port'] = 80;
  }
}

//get request
$strRequest = "GET ".$arrUrl['uri']." HTTP/1.1rn";
$strRequest .= "Host: ".$arrUrl['host']."rn";
$strRequest .= "Accept: */*rn";
if($strRef!='') {
  $strRequest .= "Referer: $strRefrn";
}
$strRequest .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)rn";
$strRequest .= "Pragma: no-cachern";
$strRequest .= "Cache-Control: no-cachern";
$strRequest .= "Connection: closernrn";
//open socket
$fp = @fsockopen($arrUrl['host'],$arrUrl['port'],$intError, $strError, 30)
  or die("cann't connect to ".$arrUrl['host'].".n".$intError.': '.$strError);
//send request
fwrite($fp,$strRequest);
//deal with response
$bolHeader = true;
while (!feof($fp)) {
  //get response line
  $str = fgets($fp, 4096);
  //http header
  if($bolHeader) {
    header($str);
  //http body
  }else {
    echo($str);
  }
  //header end
  if($str=="rn") {
    $bolHeader=false;
    header("Content-type: application/gzip");
    header('Content-Disposition: attachment; filename="'.$arrUrl['filename'].'"');
  }
}
//close socket
fclose($fp);
?>
顶端 Posted: 2006-04-20 17:58 | [楼 主]
PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 » PHP中高级

时:11-23 20:02 Copyright © 2006 phpwhy.com 权
ICP05060669

曳息 -