先ほど書いた練習作品。まだ実用的な価値がありそうな気がします。 。みんなに試してもらえるようにリリースしてください。
機能: phpによるプロキシ機能を実現
対象ユーザー: 自宅でのダウンロードが遅い。代理人を見つけるのも面倒です。そして高速なホストがあり、ホストにはphpがあり、ホストはソケットをサポートしています。
使用方法:
1.このプログラムをホストに転送します
2.ブラウザ経由でホスト上のこのファイルを参照します
3. URLにダウンロードしたいファイルのアドレスを入力します(必要に応じてリファラーを入力できます)
4. [プロキシ URL を取得] をクリックします
5.新しく開いたページのリンクは、プロキシを介してダウンロードされたリンクです
注:
1.マルチスレッドのダウンロードをサポートし、ブレークポイントでダウンロードを再開します
2. http プロトコルのみをサポートします
3.サーバー側ヘッダーのリダイレクトはサポートされていません
4. http認証
5をサポートしていません。より大きなファイルをダウンロードする場合、プログラム内の set_time_limit の値を変更して切断を減らすことができます (デフォルトは 180、つまり 3 分です)
PHP コード: -------------- - ------------------------------------------------- - ---------------
/**************************************/
/* */
/* Php Http プロキシ */
/* バージョン: 0.0 。 2 */
/* 最終変更日: 2005.1.12 */
/* 作成者: 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) ; InDefine ('pp_return_all', 3);
var $ _strurl;
var $ _arrurl;
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) {
$this->_strError;
}elseif($enumReturnType==PP_ERROR_CODE) {
$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 = 'エラーはありません' ;
//arrurl のデフォルト値
$this->_arrDefaultArrayUrl = array('protocol'=>'http','file'=>'index.htm');
//デフォルトのポート
$this-> ;_arrDefaultPort =array('http'=>'80');
Return true;
}
function setUrl($strUrl) {
$strUrl = トリム($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['プロトコル']) {
$arrUrl[1] = $this->_arrDefaultArrayUrl['プロトコル'].': //';
}
//ファイル名を設定します
$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['パス']?$arr['パス']:'/') 。 ($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) {
$this->_strUrl;
を返す }elseif($enumReturnType==PP_RETURN_ARRAY) {
$this->_arrUrl;
を返す }if($enumReturnType==PP_RETURN_ALL) {
Return array($this->_strUrl,$this->_arrUrl);
}else {
Return $this->setError(1001);
}
}
function setRefer($strRef) {
$this->_strRef = トリム($strRef);
Return true;
}
function getRefer() {
Return $this->_strRef;
}
function getProxyUrl() {
グローバル $_SERVER;
リスト($strProcotol) =explode('/',strto lower(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['プロトコル']).'Request'}();
}
関数 sendRequest() {
Return fwrite($this->_resSocket,$this->getRequest());
}
関数 flashResponse () {
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.1rn";
foreach($arrRequest as $key=>$val) {
$strRequest .="$key: $valrn";
}
$strRequest .="rn";
Return $strRequest;
}
function flashHttpResponse() {
$bolHeader=true;
while (!feof($this->_resSocket)) {
$str = fgets($this->_resSocket, 4096);
if($bolHeader ) {
@header($str);
}else {
echo($str);
}
if($bolHeader && $str=="rn") {
$bolHeader=false;
@header("Content -type: application/gzip");
@header('Content-Disposition:attachment; filename="'.$this->_arrUrl['file'].'"');
}
}
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 ('
<頭>