목차
点击此处通过 PhpProxy 下载文件" >点击此处通过 PhpProxy 下载文件
백엔드 개발 PHP 튜토리얼 用php实现proxy功能的示范[已升级至v0.0.2]_PHP

用php实现proxy功能的示范[已升级至v0.0.2]_PHP

Jun 01, 2016 pm 12:40 PM
arr return 기능 치받이 성취하다

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分钟)


PHP代码:--------------------------------------------------------------------------------

/***************************************/
/* */
/* Php Http Proxy */
/* version: 0.0.2 */
/* last modify: 2005.1.12 */
/* author: q3boy */
/* */
/***************************************/
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('



PhpProxy



















PhpProxy
URL:
REFERER:





');
}
$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("

点击此处通过 PhpProxy 下载文件

");
}
//取文件
$objProxy->proxy();
//错误处理
if($objProxy->getError()) {
die($objProxy->getError(PP_ERROR_MESSAGE));
}
?>


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

vivox100s와 x100의 차이점: 성능 비교 및 ​​기능 분석 vivox100s와 x100의 차이점: 성능 비교 및 ​​기능 분석 Mar 23, 2024 pm 10:27 PM

vivox100s와 x100 휴대폰은 모두 in vivo 휴대폰 제품군의 대표적인 모델입니다. 두 휴대폰은 각각 서로 다른 시대의 vivo 첨단 기술 수준을 대표하므로 디자인, 성능, 기능 면에서 일정한 차이가 있습니다. 이번 글에서는 소비자들이 자신에게 꼭 맞는 휴대폰을 선택할 수 있도록 두 휴대폰을 성능비교와 기능분석 측면에서 자세히 비교해보겠습니다. 먼저 vivox100s와 x100의 성능 비교를 살펴보겠습니다. vivox100s에는 최신 기술이 탑재되어 있습니다.

Huawei 휴대폰에서 이중 WeChat 로그인을 구현하는 방법은 무엇입니까? Huawei 휴대폰에서 이중 WeChat 로그인을 구현하는 방법은 무엇입니까? Mar 24, 2024 am 11:27 AM

Huawei 휴대폰에서 이중 WeChat 로그인을 구현하는 방법은 무엇입니까? 소셜 미디어의 등장으로 WeChat은 사람들의 일상 생활에 없어서는 안될 커뮤니케이션 도구 중 하나가 되었습니다. 그러나 많은 사람들이 동일한 휴대폰에서 동시에 여러 WeChat 계정에 로그인하는 문제에 직면할 수 있습니다. Huawei 휴대폰 사용자의 경우 듀얼 WeChat 로그인을 달성하는 것은 어렵지 않습니다. 이 기사에서는 Huawei 휴대폰에서 듀얼 WeChat 로그인을 달성하는 방법을 소개합니다. 우선, 화웨이 휴대폰과 함께 제공되는 EMUI 시스템은 듀얼 애플리케이션 열기라는 매우 편리한 기능을 제공합니다. 앱 듀얼 오픈 기능을 통해 사용자는 동시에

win10 시스템 업그레이드 후 인터넷에 접속할 수 없는 문제를 해결하는 방법에 대한 튜토리얼 win10 시스템 업그레이드 후 인터넷에 접속할 수 없는 문제를 해결하는 방법에 대한 튜토리얼 Mar 27, 2024 pm 02:26 PM

1. 아래와 같이 win+x 단축키를 사용하여 메뉴를 열고 [명령 프롬프트(관리자)(A)]를 선택합니다. 2. 명령 프롬프트 인터페이스에 들어간 후 [ipconfig/flushdns] 명령을 입력하고 Enter를 누릅니다. 3. 그런 다음 아래 그림과 같이 [netshwinsockresetcatalog] 명령을 입력하고 Enter를 누릅니다. 4. 마지막으로 [netshintipreset] 명령을 입력하고 Enter를 누르고 컴퓨터를 다시 시작하면 인터넷에 액세스할 수 있습니다. , 아래 그림과 같이:

셀프미디어란 정확히 무엇인가? 주요 특징과 기능은 무엇입니까? 셀프미디어란 정확히 무엇인가? 주요 특징과 기능은 무엇입니까? Mar 21, 2024 pm 08:21 PM

인터넷의 급속한 발전으로 셀프미디어라는 개념은 사람들의 마음속에 깊이 뿌리내렸습니다. 그렇다면 셀프미디어란 정확히 무엇인가? 주요 특징과 기능은 무엇입니까? 다음에는 이러한 문제를 하나씩 살펴보겠습니다. 1. 셀프미디어란 정확히 무엇인가? We-media는 이름에서 알 수 있듯이 당신이 미디어라는 뜻입니다. 개인이나 팀이 인터넷 플랫폼을 통해 콘텐츠를 독립적으로 생성, 편집, 출판 및 전파할 수 있는 정보 매체를 말합니다. 신문, 텔레비전, 라디오 등과 같은 전통적인 미디어와 달리 셀프 미디어는 더욱 상호작용적이고 개인화되어 있어 모든 사람이 정보의 생산자이자 전파자가 될 수 있습니다. 2. 셀프미디어의 주요 특징과 기능은 무엇입니까? 1. 낮은 문턱: 셀프미디어의 등장으로 미디어 산업에 진출하기 위한 문턱이 낮아졌습니다. 더 이상 번거로운 장비와 전문팀이 필요하지 않습니다.

Xiaoyi가 지능형 에이전트로 업그레이드되었습니다! HarmonyOS NEXT Hongmeng 네이티브 인텔리전스가 새로운 AI 시대를 엽니다 Xiaoyi가 지능형 에이전트로 업그레이드되었습니다! HarmonyOS NEXT Hongmeng 네이티브 인텔리전스가 새로운 AI 시대를 엽니다 Jun 22, 2024 am 01:56 AM

6월 21일, 화웨이 개발자 컨퍼런스 2024(HDC2024)가 둥관 송산호에서 다시 모였습니다. 이번 컨퍼런스에서 가장 눈길을 끄는 점은 HarmonyOSNEXT가 개발자와 선구적인 사용자를 위한 베타를 공식적으로 출시하고 모든 시나리오, 기본 인텔리전스 및 기본 보안에서 HarmonyOSNEXT의 세 가지 "최고의" 혁신 기능을 포괄적으로 시연한다는 것입니다. HarmonyOSNEXT 네이티브 인텔리전스: 새로운 AI 시대를 열다 HarmonyOSNEXT는 안드로이드 프레임워크를 버리고 안드로이드와 iOS로부터 독립된 진정한 독립 운영체제가 되었으며, 이는 전례 없는 재탄생이라고 할 수 있습니다. 많은 새로운 기능 중에서 네이티브 인텔리전스는 의심할 여지 없이 사용자에게 직관적인 느낌과 업그레이드 경험을 가장 잘 제공할 수 있는 새로운 기능입니다.

Honor 휴대폰을 Hongmeng 시스템으로 업그레이드하는 방법에 대한 자세한 설명 Honor 휴대폰을 Hongmeng 시스템으로 업그레이드하는 방법에 대한 자세한 설명 Mar 25, 2024 am 11:51 AM

새로운 기술 분야에서는 항상 새로운 운영체제가 많은 주목을 받습니다. 최근 Honor 휴대폰은 Huawei가 개발한 새로운 운영 체제인 Hongmeng OS로 업그레이드될 것이라고 발표했습니다. 이는 의심할 여지 없이 많은 Honor 휴대폰 사용자에게 좋은 소식입니다. 그러나 많은 사용자들은 여전히 ​​Hongmeng 시스템으로 업그레이드하는 방법에 대해 의구심을 갖고 있을 수 있습니다. 이 기사에서는 Honor 휴대폰을 Hongmeng 시스템으로 업그레이드하는 방법을 자세히 설명하여 사용자가 이를 더 잘 이해하고 작동할 수 있도록 돕습니다. 우선 Honor 휴대폰을 Hongmeng 시스템으로 업그레이드하려면 사용자는 휴대폰이 네트워크에 연결되어 있고 전력이 충분한지 확인해야 합니다. 이것

wps 버전을 업그레이드하는 방법은 무엇입니까? wps office 버전을 업데이트하는 방법은 무엇입니까? wps 버전을 업그레이드하는 방법은 무엇입니까? wps office 버전을 업데이트하는 방법은 무엇입니까? Mar 14, 2024 am 08:43 AM

WPS는 많은 사용자에게 꼭 필요한 컴퓨터 소프트웨어입니다. 새 버전을 정기적으로 업데이트하면 사용자는 더 나은 사용자 경험과 더 많은 기능을 얻을 수 있습니다. 그렇다면 wps 버전을 업그레이드하는 방법은 무엇입니까? wpsoffice를 업그레이드하는 데는 세 가지 주요 방법이 있습니다. 아래에서 살펴보겠습니다. 방법 1: 공식 웹사이트에서 새 버전을 다운로드합니다. WPSOffice 공식 웹사이트에서 최신 버전의 설치 패키지를 다운로드할 수 있습니다. WPSOffice 공식 웹사이트(https://www.wps.cn/)에 접속한 후 "다운로드" 버튼을 클릭하고 다운로드해야 하는 버전을 선택한 후 안내에 따라 설치하세요. 참고: 새 버전을 설치할 때 이전 버전을 제거해야 합니다. 그렇지 않으면 소프트웨어 충돌이 발생하여 정상적인 사용이 불가능해집니다. 방법 2: WPSOf에서

Xiaomi 14Pro를 ThePaper OS로 업그레이드하는 방법은 무엇입니까? Xiaomi 14Pro를 ThePaper OS로 업그레이드하는 방법은 무엇입니까? Mar 18, 2024 pm 07:34 PM

Mi 14 Pro는 Xiaomi의 최신 플래그십 휴대폰이며 ThePaper OS는 Xiaomi가 독립적으로 개발한 새로운 운영 체제로 더욱 부드럽고 스마트한 사용자 경험을 제공하는 데 전념하고 있습니다. 지속적인 기술 개발로 ThePaper OS도 지속적으로 업데이트되고 업그레이드되고 있습니다. 샤오미 휴대폰을 처음 사용하는 많은 사용자들이 샤오미 14Pro 사용자에게 ThePaper OS를 업그레이드하는 방법을 문의하고 있습니다. Xiaomi Mi 14 Pro를 Thermal OS로 업그레이드하는 방법 원래 공장에는 Thermal OS가 함께 제공됩니다. ThePaper OS를 지원하는 다른 모델을 업데이트하는 방법: 1. 휴대폰의 설정 애플리케이션을 열고 시스템 업데이트 옵션을 찾습니다. 2. 시스템은 현재 시스템 버전을 자동으로 감지하고 새 버전을 업데이트할 수 있을 때 메시지를 표시합니다. 3. "지금 업데이트"를 클릭하면 시스템이 자동으로 다운로드를 시작합니다.

See all articles