喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

招聘PHP开发人员(北京)

上一主题 下一主题
 20  1/2  1  2  > 
     
标题: 用php实现proxy功能的示范  
 
q3boy (q3boy)
版主
Rank: 7Rank: 7Rank: 7
版主



UID 15982
精华 7
积分 1889
帖子 1751
金钱 1819 喜悦币
威望 70
人脉 0
阅读权限 100
注册 2002-8-19
状态 离线
[广告]: 代充Paypal帐号美元
用php实现proxy功能的示范 [已升级至v0.0.2]

刚刚写的练手的作品。感觉还是有些实用价值的。。放出来给大家试试。
功能:通过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分钟)

<?php
/***************************************/
/*                                     */
/*    Php Http Proxy                   */
/*    version: 0.0.2                   */
/*    last modify: 2005.1.12           */
/*    author: q3boy<q3boy@sina.com>    */
/*                                     */
/***************************************/
set_time_limit(180);

define('PP_ERROR_CODE',1);
define('PP_ERROR_MESSAGE',2);
define('PP_ERROR_ALL',3);
define('PP_RETURN_STRING',1);
define('PP_RETURN_ARRAY',2);
define('PP_RETURN_ALL',3);

class 
CPhpProxy {

    var 
$_strUrl;
    var 
$_arrArgv;
    var 
$_strRef;
    var 
$_arrUrl;
    var 
$_resSocket;
    var 
$_intError;
    var 
$_strError;
    var 
$_arrDefaultArrayUrl;
    var 
$_arrDefaultPort;

    function 
CPhpProxy($strUrl null$arrArgv = array()) {
        
$this->init();
        
is_null($strUrl)?'':$this->setUrl($strUrl);
        
is_null($arrArgv['refer'])?'':$this->setRef($arrArgv['refer']);
        
$this->proxy($strUrl,$arrArgv);
    }
    function 
setError($intError,$mixArgv=null) {
        
$this->_intError $intError;
        if(
$intError==1001) {
            
$this->_strError "调用 $mixArgv 方法时参数传递出错, 枚举值不存在";
        }elseif(
$intError==1) {
            
$this->_strError "url 错误, url 格式不正确.\n".$mixArgvs;
        }elseif(
$intError == 2) {
            
$this->_strError "url 错误, 目前尚未支持此协议.\n".$mixArgvs;
        }elseif(
$intError == 3) {
            
$this->_strError "无法打开 ".$this->_arrUrl['host'].':'.$this->_arrUrl['port']."\n".$mixArgv[0].': '.$mixArgv[1];
        }
        
        Return 
false;
    }

    function 
getError($enumReturnType=PP_ERROR_CODE) {
        if(
$enumReturnType==PP_ERROR_ALL) {
            Return array(
str_pad($this->_intError,5,'0',STR_PAD_LEFT),$this->_strError);
        }elseif(
$enumReturnType==PP_ERROR_MESSAGE) {
            Return 
$this->_strError;
        }elseif(
$enumReturnType==PP_ERROR_CODE) {
            Return 
$this->_intError;
        }else {
            Return 
false;
        }
    }

    function 
init() {
        
$this->_strUrl null;
        
$this->_arrArgv = array();
        
$this->_strRef null;
        
$this->_arrUrl = array();
        
$this->_resSocket null;
        
$this->_intError 0;
        
$this->_strError 'there is no error';
        
//arrurl 默认值
        
$this->_arrDefaultArrayUrl = array('protocol'=>'http','file'=>'index.htm');
        
//默认端口
        
$this->_arrDefaultPort =array('http'=>'80');
        Return 
true;
    }
    function 
setUrl($strUrl) {
        
$strUrl trim($strUrl);
        
//正则
        
$reg "/^(([\w]+):\/\/)?([^:|\/|@]*:)?([^:|\/|@]*@)?([\w|\-|\.]+)(:\d+)?(\/[^\?|#]*)?(\?[^#]*)?(#.*)?$/is";
        if(!
preg_match($reg,$strUrl,$arrUrl)) {
            Return 
$this->setError(1,$strUrl);
        }else {
            
//拆解匹配数组
            
list($tmp$tmp$arr['protocol'], $arr['user'], $arr['pass'], $arr['host'], $arr['port'], $arr['path'], $arr['query'], $arr['anchor']) = $arrUrl;
            
//默认协议
            
if(!$arr['protocol']) {
                
$arrUrl[1] = $this->_arrDefaultArrayUrl['protocol'].'://';
            }
            
//设 filename
            
$arr['file'] = basename($arr['path']);
            
//默认值
            
foreach($this->_arrDefaultArrayUrl as $key=>$val) {
                if(
$arr[$key] == '') {
                    
$arr[$key] = $val;
                }
            }
            
//默认端口
            
if(is_null($this->_arrDefaultPort[$arr['protocol']])) {
                Return 
$this->setError(2,$arr['protocol']);
            }elseif(!
$arr['port']) {
                
$arr['port'] = $this->_arrDefaultPort[$arr['protocol']];
            }

            
//设 uri
            
$arr['uri']  = ($arr['path']?$arr['path']:'/') . ($arr['query']?'?'.$arr['query']:'') . ($arr['anchor']?'#'.$arr['anchor']:'');
            
//设 url
            
unset($arrUrl[0]);
            unset(
$arrUrl[2]);
            
$this->_strUrl implode('',$arrUrl);
            
//设 arrurl
            
$this->_arrUrl $arr;
            Return 
true;
        }
    }
    function 
getUrl($enumReturnType PP_RETURN_ARRAY) {
        if(
$enumReturnType==PP_RETURN_STRING) {
            Return 
$this->_strUrl;
        }elseif(
$enumReturnType==PP_RETURN_ARRAY) {
            Return 
$this->_arrUrl;
        }if(
$enumReturnType==PP_RETURN_ALL) {
            Return array(
$this->_strUrl,$this->_arrUrl);
        }else {
            Return 
$this->setError(1001);
        }
        
    }
    function 
setRefer($strRef) {
        
$this->_strRef trim($strRef);
        Return 
true;
    }
    function 
getRefer() {
        Return 
$this->_strRef;
    }

    function 
getProxyUrl() {
        global 
$_SERVER;
        list(
$strProcotol) = explode('/',strtolower(trim($_SERVER['SERVER_PROTOCOL'])));
        
$str $strProcotol.'://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].
                 
'?u='.urlencode($this->getUrl(PP_RETURN_STRING)).
                 (
$this->getRefer()?('&r='.urlencode($this->getRefer())):'');
        Return 
$str;
    }
    function 
openSocket() {
        
$arr $this->getUrl();
        
$this->_resSocket = @fsockopen($arr['host'],$arr['port'],$intError$strError30);
        if(!
$this->_resSocket) {
            
$this->_resSocket null;
            Return 
$this->setError(3,array($intError$strError));
        }else {
            Return 
true;
        }
    }
    function 
getRequest() {
        Return 
$this->{'get'.ucfirst($this->_arrUrl['protocol']).'Request'}();
    }
    function 
sendRequest() {
        Return 
fwrite($this->_resSocket,$this->getRequest());
    }
    function 
flushResponse() {
        Return 
$this->{'flush'.ucfirst($this->_arrUrl['protocol']).'Response'}();
    }
    function 
getHttpRequest() {
        
$arr $this->getUrl();
        
$arrRequest getallheaders();
        
$arrRequest['Host'] = $arr['host'];
        
$strRequest  "GET ".$arr['uri']." HTTP/1.1\r\n";
        foreach(
$arrRequest as $key=>$val) {
            
$strRequest .="$key: $val\r\n";
        }
        
$strRequest .="\r\n";
        Return 
$strRequest;
    }
    function 
flushHttpResponse() {
        
$bolHeader=true;
        while (!
feof($this->_resSocket)) {
            
$str fgets($this->_resSocket4096);
            if(
$bolHeader) {
                @
header($str);
            }else {
                echo(
$str);
            }
            if(
$bolHeader && $str=="\r\n") {
                
$bolHeader=false;
                @
header("Content-type: application/gzip");
                @
header('Content-Disposition: attachment; filename="'.$this->_arrUrl['file'].'"');
            }
        }
        Return 
true;
    }
    function 
close() {
        
fclose($this->_resSocket);
        
$this->_resSocket null;
        Return 
true;
    }
    function 
proxy($strUrl null,$arrArgv = array()) {
        if(!
is_null($this->getUrl(PP_RETURN_STRING)) && $this->openSocket() && $this->sendRequest() && $this->flushResponse()) {
            echo(
123);
            
$this->close();
        }else {
            Return 
false;
        }
    }
}
if(
sizeof($_GET)) {
    
$strGetArrayName '_GET';
}elseif(
sizeof($HTTP_GET_VARS)) {
    
$strGetArrayName 'HTTP_GET_VARS';
}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>PhpProxy</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">PhpProxy</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>'
);
}
$strUrl trim(${$strGetArrayName}['u']);
if(
$strUrl=='') {
    die(
'请输入 url 地址.');
}
//get referer
$strRefTmp trim(${$strGetArrayName}['r']);
//初始化 proxy 类
$objProxy = new CPhpProxy();
//设置 url 和 refer
$objProxy->setUrl($strUrl);
$objProxy->setRefer($strRef);
//错误输出
if($objProxy->getError()) {
    die(
$objProxy->getError(PP_ERROR_MESSAGE));
}

//echo url for download
if(${$strGetArrayName}['act']=='make') {
    die(
"<center><h4><a href='".$objProxy->getProxyUrl()."'>点击此处通过 PhpProxy 下载文件</a></h2></center>");
}
//取文件
$objProxy->proxy();
//错误处理
if($objProxy->getError()) {
    die(
$objProxy->getError(PP_ERROR_MESSAGE));
}
?>
2005-3-2 07:08 PM#1
查看资料  Blog  发短消息  顶部
 
tsgx8848
中级会员
Rank: 3Rank: 3
中级会员


UID 30764
精华 0
积分 453
帖子 436
金钱 453 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2004-8-26
来自 广州
状态 离线
[广告]: 代充Paypal帐号美元
好东西!试下先!!



本人QQ:253635538
欢迎交流
2005-3-3 12:53 AM#2
查看资料  访问主页  发短消息  QQ  顶部
 
shelly0577 (shelly0577)
金牌会员
Rank: 6Rank: 6
高级会员


UID 18493
精华 0
积分 1732
帖子 1735
金钱 1708 喜悦币
威望 0
人脉 24
阅读权限 70
注册 2003-2-21
状态 离线
[推荐阅读] 我怎样才能把自己的代码包(rar)放上来啊
建议楼主做个项目,大家不断把这个东东做大。象国外的  cgiProxy 一样。
sf.net  id mrshelly
2005-3-3 09:19 AM#3
查看资料  访问主页  Blog  发短消息  顶部
 
sundfly (云中鹤)
论坛元老
Rank: 8Rank: 8
恶人谷四少爷


UID 21593
精华 0
积分 3455
帖子 3506
金钱 3455 喜悦币
威望 0
人脉 0
阅读权限 90
注册 2003-7-11
来自 广州
状态 离线
[推荐阅读] 请问
暂时没时间研究,顶一下老鼠先~```



我独随风身远去,唯愿缱绻仙凡间~~
2005-3-3 10:29 AM#4
查看资料  访问主页  发短消息  QQ  ICQ 状态  顶部
 
q3boy (q3boy)
版主
Rank: 7Rank: 7Rank: 7
版主



UID 15982
精华 7
积分 1889
帖子 1751
金钱 1819 喜悦币
威望 70
人脉 0
阅读权限 100
注册 2002-8-19
状态 离线
[推荐阅读] 在一个*.js文件里能不能包含另一个*.js
更新了一下.用oo重写了一遍~有兴趣的可以看看
http://www.q3boy.com/blogview_a_20050112_190936.html
2005-3-3 08:00 PM#5
查看资料  Blog  发短消息  顶部
 
netorg (netorg)
金牌会员
Rank: 6Rank: 6
资深会员



UID 25606
精华 0
积分 1232
帖子 1269
金钱 1232 喜悦币
威望 0
人脉 0
阅读权限 70
注册 2004-1-4
状态 离线
[推荐阅读] 诚聘PHP和MySQL技术工程师/产品经理
强人, 顶你一下。



巴壁虎:http://www.babihu.com
2005-3-4 01:27 AM#6
查看资料  访问主页  发短消息  顶部
 
nuying117
新手上路
Rank: 1
版主


UID 20038
精华 0
积分 6
帖子 3165
金钱 6 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2003-5-22
来自 杭州
状态 离线
[推荐阅读] 求文件中插入行另起一行
这个可以实现多线程下载????????



人至淫则无敌,比喻阿矿,比喻csqspc
2005-3-4 01:29 AM#7
查看资料  发短消息  QQ  顶部
 
nuying117
新手上路
Rank: 1
版主


UID 20038
精华 0
积分 6
帖子 3165
金钱 6 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2003-5-22
来自 杭州
状态 离线
[推荐阅读] 推荐一款blog吧?
搂主,多线程下载是不是就是使用flashget之类的下载工具的时候可以开多个线程进行下载?如果是的话,给我们讲讲这个程序是如何实现多线程下载的吧?我看了看代码,没发现特别的地方啊,谢谢



人至淫则无敌,比喻阿矿,比喻csqspc
2005-3-4 01:30 AM#8
查看资料  发短消息  QQ  顶部
 
yhlong (yhlong)
金牌会员
Rank: 6Rank: 6
高级会员



UID 10030
精华 3
积分 1400
帖子 1338
金钱 1370 喜悦币
威望 30
人脉 0
阅读权限 70
注册 2001-11-2
来自 山东烟台
状态 离线
[推荐阅读] 男人25岁前的忠告
非常好,学习!
2005-3-4 11:30 AM#9
查看资料  发短消息  顶部
 
yhlong (yhlong)
金牌会员
Rank: 6Rank: 6
高级会员



UID 10030
精华 3
积分 1400
帖子 1338
金钱 1370 喜悦币
威望 30
人脉 0
阅读权限 70
注册 2001-11-2
来自 山东烟台
状态 离线
[推荐阅读] 十三种你平常不知道的事情


QUOTE:
最初由 q3boy 发布
[B]更新了一下.用oo重写了一遍~有兴趣的可以看看
http://www.q3boy.com/blogview_a_20050112_190936.html [/B]
代码被显示了?能整理一下吗?
2005-3-4 11:32 AM#10
查看资料  发短消息  顶部
 20  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.075667 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP