ホームページ >php教程 >php手册 >PHP fsockopen で書かれた HTTP ダウンロード クラスを公開する

PHP fsockopen で書かれた HTTP ダウンロード クラスを公開する

WBOY
WBOYオリジナル
2016-06-13 12:33:271037ブラウズ

リモート コンテンツを開くオプションがサポートされている場合、PHP は実際に fopen または file_get_contents を使用して Web ページのコンテンツを取得できます。ただし、デフォルトの関数には HTTP ヘッダーを取得できないという欠点があり、一部の特殊なアプリケーションでは非常に不便です。たとえば、次のリンクがあります:

http://www.abc.com/showvd.asp?id=18

画像が返される場合、次のリンクを使用して識別するのは困難になります。デフォルトの関数ですが、HTTP レスポンスヘッダーで判断するほうが簡単です。また、相手がホットリンクを防ぐために Refer を使用している場合は、HTTP クラスを使用することでこれらの問題を完全に解決でき、速度も向上します。ほぼ同じです。


使用法:

$hd = new DedeHttpDown();
$hd->OpenUrl("http://www.dedecms.com"); >echo $hd->GetHtml();
//ファイルとして保存する場合は、$hd->SaveBin("dede.html");
$hd->Close(); 🎜>

$hd->GetHead("key") で http リクエスト ヘッダーを取得します。
リクエスト ヘッダーを設定します
$hd->SetHead(key, value); OpenUrl の後に呼び出されます。 以前に設定された)


コードは次のとおりです:

<
/* --------------- ----------- -------------------------------------- -----------
//Dream Weaving HTTP ダウンロード クラス V1.0
//From: Dream Weaving Journey http://www.dedecms.com
//著者: IT Plato
//時間: 2005- 11-13 12:39
//声明: Left Behind Web サイトで最初に公開されました。再版する場合は著作権情報を保持してください
-------- ---------------------------------------------------- ------------ */
class DedeHttpDown
{
var $m_url = "";
var $m_urlpath = ""; "http";
var $m_port = "80";
var $m_pass = ""; m_path = "/";
var $m_fp = "";
var $m_httphead = ""; $m_html = "";
var $m_puthead = "";
var $HomeUrl = ""; var $JumpCount = 0;無限ループに陥るのを防ぎます
//
//初期化システム
//
function PrivateInit($url)
{
if($url=="") return ;
$urls = "";
$urls = @parse_url( $url);
$this->m_host = $urls["host"];
if(!empty($urls["scheme"])) $this->m_scheme = $urls["scheme"];

if(!empty($url s["user" ])){


if(!empty($ urls ["pass"])){
$ this-&gt; m_pass = $ urls ["pass"];
}

if(!empty($urls["port"]))){ $this->m_port = $urls["ポート"];
}

if(!empty($urls["path"])) $this->m_path = $urls["path"];
$this->m_urlpath = $this->m_path;

if(!empty($urls["query"])){
$this->m_query = $urls["クエリ"];
$this->m_urlpath .= "?".$this->m_query;
}
$this->HomeUrl = $urls["host"];
$this->BaseUrlPath = $this->HomeUrl.$urls["path"];
$this->BaseUrlPath = ereg_replace("/([^/]*).(.*)$","/",$this->BaseUrlPath);
$this->BaseUrlPath = ereg_replace("/$","",$this->BaseUrlPath);
}
}
//
//打开指定网址
//
function OpenUrl($url)
{
// 重各パラメータ
$this->m_url = "";
$this->m_urlpath = "";
$this->m_scheme = "http";
$this->m_host = "";
$this->m_port = "80";
$this->m_user = "";
$this->m_pass = "";
$this->m_path = "/";
$this->m_query = "";
$this->m_error = "";
$this->JumpCount = 0;
$this->m_httphead = Array() ;
//$this->m_puthead = "";
$this->m_html = "";
$this->Close();
//初化系统
$this->PrivateInit($url);
$this->PrivateStartSession();
}
//
//打开303重定向网址
//
function JumpOpenUrl($url)

// 重设各パラメータ
$this-> m_url = "";
$this->m_urlpath = "";
$this->m_scheme = "http";
$this->m_host = "";
$this->m_port = "80";
$this->m_user = "";
$this->m_pass = "";
$this->m_path = "/";
$this->m_query = "";
$this->m_error = "";
$this->JumpCount ;
$this->m_httphead = Array() ;
$this->m_html = "";
$this->Close();
//初化系统
$this->PrivateInit($url);
$this->PrivateStartSession();
}
//
//特定の操作错误の原因
//
function printError()

echo "错误情報:".$this-> ;m_エラー;
echo "特定の返头:
";
foreach($this->m_httphead as $k=>$v)
{ echo "$k =>> $v
rn"; }
}
//
//判别用Getメソッド送信的头的应答結果否か正确
//
function IsGetOK()
{
if( ereg( "^2",$this->GetHead("http-state")) )
{ return true; }
Head("http-describe") ."
";
テキスト型かどうか
//
function IsText()
{
if( ereg( "^2",$this->GetHead("http-state"))
&& eregi("^text",$this->GetHead ("content-type"))
$this ->m_error .= "コンテンツは非テキスト タイプまたは URL リダイレクトです
return false; // 🎜> {
{ $ctype))
{ return true; }
else
{
$this->m_error .= "間違ったタイプ".$this->GetHead("content-type") "
";ファイルをダウンロード
//
関数 SaveToBin($savefilename)
{ !"; return false; }
fwrite($fp,fread($ this->m_fp,1024)); true を返す 🎜> this->IsText()) $this->SaveBinFile($savefilename) ;
function GetHtml()
{ if(!$this->m_fp||@feof($this->m_fp)) return "" ;m_html .= fgets($this->m_fp) 、256); m_html;

if($this->GetHead("http-edition")=="HTTP/1.1") $httpv = "HTTP/1.1"
else $httpv = "HTTP/1.0"; ; > // 固定開始リクエストのヘッド GET と HOST 情報を送信
FPUTS ($ this- & gt; m_fp, "get". $ This- & gt; m_urlpath. "$ Httpvrn"); m_puthead["Accept"] = "*/*";
} { $this->m_puthead[ "ユーザーエージェント"] = "Mozilla/4.0 (互換性; MSIE 6.0; Windows NT 5.2)" }
If(!isset($this->m_puthead["Refer" ])) { $this-> ;m_puthead["参照"] = "http://".$this->m_puthead["ホスト"] }
foreach($this->m_puthead as $k =>$v){
if($ k!= "" && $ v!= ""){
fputs($ this-&gt; m_fp、 "$ k:$ vrn"); end request header
.1 プロトコルは、ドキュメントの終了後にリンクが閉じられることを指定する必要があります。そうでない場合、ドキュメントの読み取り時に feof を使用して終了を判断することはできません
if($httpv=="HTTP/1.1") fputs($this->m_fp,"接続: Closernrn" );
else fputs($this->m_fp,"rn") ($this-> ;m_fp,256); this->m_httphead["http-edition"] = トリム($httpstas[0]);
$this->m_httphead["http-state"] = トリム($httpstas[1]); > $this->m_httphead["http-describe"] ){
$this->
//获取详细应答头
while(!feof($this->m_fp))
$line = trim(fget s($this->m_fp,256));
if($line == "") break;
$hkey = "";
$hvalue = "";
$v = 0;
for($i=0;$i if($v==1) $hvalue .= $line[$i];
if($line[$i]==":") $v = 1;
if($v==0) $hkey .= $line[$i];

$hkey = trim($hkey);
if($hkey!="") $this->m_httphead[strto lower($hkey)] = trim($hvalue);

// 判断は3xx开头的应答
if(ereg("^3",$this->m_httphead["http-state"]))
{
if($this->JumpCount >3) return;
if(isset($this->m_httphead["location"])){
$newurl = $this->m_httphead["location"];
if(eregi("^http",$newurl)){
$this->JumpOpenUrl($newurl);
}
🎜> else
スルー"; }
> name)
{
$headname = str to lower($headname);
if(isset($this->m_httphead[$headname]))
return $this- >m_httphead[$headname]; else
return "" }
🎜> $this >m_puthead[$skey] = $svalue; {
if($this - &gt; m_host == "")false;
//
//补全相对网址
//
function FillUrl($surl)
{
$i = 0;
$dstr = "";
$pstr = "";
$okurl = "";
$pathStep = 0;
$surl = trim($surl);
if($surl=="") return "";
$pos = strpos($surl,"#");
if($pos>0) $surl = substr($surl,0,$pos);
if($surl[0]=="/"){
$okurl = "http://".$this->HomeUrl."/".$surl;
}
else if($surl[0]==".")
{
if(strlen($surl)<=2) return "";
else if($surl[0]=="/")
{
$okurl = "http://".$this->BaseUrlPath."/".substr($surl, 2,strlen($surl)-2);
}
else{
$urls = explode("/",$surl);
foreach($urls as $u){
if($u=="..") $pathStep ;
else if($i else $dstr .= $urls[$i];
$i ;
}
$urls = explode("/",$this->BaseUrlPath);
if(count($urls) <= $pathStep)
return "";
else{
$pstr = "http://";
for($i=0;$i { $pstr .= $urls[$i]."/"; }
$okurl = $pstr.$dstr;
}
}
}
else
{
if(strlen($surl)<7)
$okurl = "http://".$this- >BaseUrlPath."/".$surl;
else if(strto lower(substr($surl,0,7))=="http://")
$okurl = $surl;
else
$okurl = "http://".$this->BaseUrlPath."/".$surl;
}
$okurl = eregi_replace("^(http://)","",$okurl);
$okurl = eregi_replace("/{1,}","/",$okurl);
return "http://".$okurl;
}
}
?>

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。