用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
/***************************************/
/* */
/* 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, $strError, 30);
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->_resSocket, 4096);
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));
}
?>

时间: 2024-10-24 17:29:44

用php实现proxy功能的示范 [已升级至v0.0.2]的相关文章

h-怎样对一个程序实现的功能移植到已有的一个大MFC项目中?

问题描述 怎样对一个程序实现的功能移植到已有的一个大MFC项目中? 1// HttpPost.cpp written by l_zhaohui@163.com 2// 2007/11/30 3#include "stdafx.h" 4#include <windows.h> 5#include <stdio.h> 6#include <stdlib.h> 7 8#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS 9#

盛大文学周洪立:电子书已跨入2.0时代

[TechWeb报道]7月21日消息,在2010数字出版年会上,盛大文学首席 版权官周洪立表示,现在已经跨进电子书交互平台2.0时代.他认为,电子书行业亟待制定行业标准,在这个过程中,政府将起主导作用. 电子书将很大程度取代传统书 周洪立称:"一百年以后,书肯定有,但比重会大大降低,电子书会极大的流行,会进入千家万户,用不了多长时间,就会像手机一样,人手一部,甚至两部.即使它不能100%取代传统书,也会在很大程度上取代传统书.它将成为人们的一种被广泛接受的阅读方式,它甚至成为人们的一种生活方式,

《ANSYS 14热力学/电磁学/耦合场分析自学手册》——第 2 章 ANSYS基本功能 2.1 ANSYS 14.0图形用户界面的组成

第 2 章 ANSYS基本功能 2.1 ANSYS 14.0图形用户界面的组成 ANSYS 14热力学/电磁学/耦合场分析自学手册图形用户界面使用命令的内部驱动机制,使每一个GUI(图形用户界面)操作对应了一个或若干个命令.操作对应的命令保存在输入日志文件(Jobname.log)中.所以,图形用户界面可以使用户在对命令了解很少或几乎不了解的情况下完成ANSYS分析.ANSYS提供的图形用户界面还具有直观.分类科学的优点,方便用户的学习和应用. 标准的图形用户界面如图2-1所示,包括以下几个部分

版本-安卓功能5.1下正常 4.0下异常

问题描述 安卓功能5.1下正常 4.0下异常 应用所有对php服务器的http请求,在5.1下正常,在4.4.4.0下不正常. 测试过3台手机和模拟器确认是系统版本问题,与机型无关. 比如在服务器返回福建省份的成绩名单时,5.1机型接收到的内容是:(PC上返回的也是这个结果) {"num":"9","city":{"1":"厦门","2":"泉州","3&q

等级保护制度已进入2.0时代,云等保标准颁布在即

近年来随着国内外网络安全形势发展,网际空间已经成为继海.陆.空.天之后的第五空间,成为新形势下国家安全的重要领域之一.随着"棱镜门"事件的曝光,国与国之间的信息安全对抗日益公开化,网际空间的安全威胁正逐渐呈组织化.复杂化和国际化的发展趋势.与此同时,随着云计算.大数据.移动互联网.物联网等这些新兴IT技术的发展与落地,传统信息安全的边界越来越模糊,新的攻击形态层出不穷,安全威胁呈现复杂常态化趋势. 2016年10月10日,第五届全国信息安全等级保护技术大会在云南昆明召开,公安部网络安全

c# 基础知识-已知:0.37*X+1.14*Y=95927.6, X和Y是整数。求解:X=? Y=? 求大神帮忙

问题描述 已知:0.37*X+1.14*Y=95927.6, X和Y是整数.求解:X=? Y=? 求大神帮忙 本人新手一枚,用的是C#,就是得不出结果,求大神帮忙指点一下! using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _1 { class Program { static void Main(string[] args) { for (int x =

杭州等多个城市的联通3G已升级至DC-HSDPA网络

近日关于工信部将发布4G牌照的传闻,让手机网络的速度再次成为人们关注的焦点,然而相对于距离普及仍很遥远的4G而言,提升现有的3G网络速度显然更迫切也更实在一些.据了解,中国联通就正在对其3G网络进行升级,杭州.广州.深圳等多个城市的联通3G都已经升级至DC-HSDPA网络,也就是人们平时所说的3.5G.据业内人士介绍,从3G升级到3.5G,网络速度会有2-6倍提升,而且3.5G的起步速度即有14.4M,已经远超过多数地区的ADSL带宽.我们从联通工作人员处了解到,目前市面上销售的旗舰级手机,如i

视频互动功能 定义智能成人玩具1.0时代

致力于成人情趣类可穿戴设备领域的美国智玩互动公司,正在智能成人玩具领域获得领先位置:其智能成人玩具品牌IMTOY的旗舰产品"PIU",是全球第一款可以与智能设备连接互动的情趣用品,被业界誉为"定义了智能成人玩具1.0时代的产品". ▲ 视频互动功能 定义智能成人玩具1.0时代 作为一款成人玩具,PIU用智能硬件时代的技术手段,满足了录像带时代至今,视频爱好者心中最大的幻想:观看视频时,这个玩具在下半身工作,让用户身临其境地体会加藤老师的辛劳,以及苍老师的温柔. 通过

如何安装 2007 Office 的个别功能或修复已安装的 2007 Office 程序

本文介绍如何安装 2007 Microsoft Office 功能以及如何修复已安装的 2007 Office 程序和功能. 操作步骤: 如何安装 2007 Office 的个别功能 通常,当您初次尝试使用未安装的某个 2007 Office 功能时,2007 Office 程序会自动安装该功能.如果没有自动安装您需要的功能,请执行以下步骤: 退出所有程序. 单击"开始". 如果您运行的是 Windows Vista 或 Windows 7,则在"搜索程序和文件"框