目次
点击此处通过 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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

vivox100sとx100の違い:性能比較と機能分析 vivox100sとx100の違い:性能比較と機能分析 Mar 23, 2024 pm 10:27 PM

vivox100s と x100 携帯電話はどちらも vivo の携帯電話製品ラインの代表的なモデルであり、それぞれ異なる時代における vivo のハイエンド技術レベルを代表するものであるため、2 つの携帯電話にはデザイン、性能、機能に一定の違いがあります。この記事では、消費者が自分に合った携帯電話をより適切に選択できるように、これら 2 つの携帯電話を性能比較と機能分析の観点から詳しく比較します。まずはvivox100sとx100の性能比較を見てみましょう。 vivox100s には最新の機能が搭載されています。

Huawei 携帯電話にデュアル WeChat ログインを実装するにはどうすればよいですか? Huawei 携帯電話にデュアル WeChat ログインを実装するにはどうすればよいですか? Mar 24, 2024 am 11:27 AM

Huawei 携帯電話にデュアル WeChat ログインを実装するにはどうすればよいですか?ソーシャルメディアの台頭により、WeChatは人々の日常生活に欠かせないコミュニケーションツールの1つになりました。ただし、多くの人は、同じ携帯電話で同時に複数の 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 つずつ検討していきます。 1. セルフメディアとは何ですか? We-media は、その名前が示すように、あなたがメディアであることを意味します。これは、個人またはチームがインターネット プラットフォームを通じてコン​​テンツを独自に作成、編集、公開、配布できる情報媒体を指します。新聞、テレビ、ラジオなどの従来のメディアとは異なり、セルフメディアはよりインタラクティブでパーソナライズされており、誰もが情報の制作者および発信者になることができます。 2. セルフメディアの主な特徴と機能は何ですか? 1. 敷居が低い: セルフメディアの台頭により、メディア業界への参入の敷居が低くなり、煩わしい機材や専門チームは必要なくなりました。

Xiaoyi がインテリジェント エージェントにアップグレードされました! HarmonyOS NEXT 紅蒙ネイティブインテリジェンスが新たな AI 時代を切り開く Xiaoyi がインテリジェント エージェントにアップグレードされました! HarmonyOS NEXT 紅蒙ネイティブインテリジェンスが新たな AI 時代を切り開く Jun 22, 2024 am 01:56 AM

6月21日、Huawei Developer Conference 2024(HDC2024)が東莞市松山湖に再び集まりました。今回のカンファレンスで最も目を引いたのは、HarmonyOSNEXTが開発者とパイオニアユーザー向けにベータ版を正式に開始し、すべてのシナリオにおけるHarmonyOSNEXTの3つの「画期的な」革新的な機能、ネイティブインテリジェンスとネイティブセキュリティを包括的に実証したことだ。 HarmonyOSNEXT ネイティブ インテリジェンス: 新しい AI 時代の幕開け HarmonyOSNEXT は、Android フレームワークを放棄した後、Android や iOS から独立した真に独立したオペレーティング システムとなり、前例のない復活と言えます。多くの新機能の中でも、ネイティブ インテリジェンスは間違いなく、ユーザーに直感的な感覚と体験のアップグレードを最もよくもたらす新機能です。

Honor携帯電話をHongmengシステムにアップグレードする方法の詳細な説明 Honor携帯電話をHongmengシステムにアップグレードする方法の詳細な説明 Mar 25, 2024 am 11:51 AM

新しい技術分野では、新しいオペレーティング システムが常に大きな注目を集めます。最近、Honor 携帯電話は、Huawei が開発した新しいオペレーティング システムである Honmeng OS にアップグレードされると発表されました。これは多くの Honor 携帯電話ユーザーにとって間違いなく良いニュースです。しかし、多くのユーザーはHongmeng システムにアップグレードする方法についてまだ疑問を抱いているかもしれません。この記事では、Honor 携帯電話を Honmeng システムにアップグレードする方法を詳しく説明し、ユーザーが Honor をよりよく理解し、操作できるようにします。まず、Honor 電話を Honmeng システムにアップグレードするには、ユーザーは電話がネットワークに接続されており、十分な電力があることを確認する必要があります。これ

WPSのバージョンをアップグレードするにはどうすればよいですか? WPS Officeのバージョンを更新するにはどうすればよいですか? WPSのバージョンをアップグレードするにはどうすればよいですか? WPS Officeのバージョンを更新するにはどうすればよいですか? Mar 14, 2024 am 08:43 AM

WPS は多くのユーザーにとって必須のコンピューター ソフトウェアであり、新しいバージョンに定期的に更新することで、ユーザー エクスペリエンスが向上し、より多くの機能を利用できるようになります。では、WPS のバージョンをアップグレードするにはどうすればよいでしょうか? wpsofficeのバージョンアップには主に3つの方法がありますので、以下で見ていきましょう。方法 1: 公式 Web サイトから新しいバージョンをダウンロードする WPSOffice 公式 Web サイトからインストール パッケージの最新バージョンをダウンロードできます。 WPSOffice 公式 Web サイト (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 も常に更新およびアップグレードされています。 Xiaomi 携帯電話を初めて使用する多くのユーザーが、Xiaomi 14Pro ユーザーに ThePaper OS をアップグレードする方法を尋ねていますか? Xiaomi Mi 14 Pro を Thermal OS にアップグレードするにはどうすればよいですか? 工場出荷時に Thermal OS が付属しているため、アップデートする必要はありません。 ThePaper OS をサポートする他のモデルをアップデートする方法: 1. 携帯電話の設定アプリケーションを開き、システム アップデート オプションを見つけます。 2. システムは現在のシステム バージョンを自動的に検出し、新しいバージョンが更新可能になるとプロンプトを表示します。 3. 「今すぐアップデート」をクリックするだけで、システムが自動的にダウンロードを開始します。

See all articles