원격 콘텐츠를 여는 옵션이 지원되면 PHP는 실제로 fopen 또는 file_get_contents를 사용하여 웹 페이지의 콘텐츠를 얻을 수 있지만 기본 기능에는 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")
요청 헤더 설정
$hd->SetHead(key, value); 사용(OpenUrl을 호출하기 전에 설정해야 함)
코드는 다음과 같습니다. 다음과 같습니다:
<
/* ----------------------- ----- ---------------
//DreamWeaver Http 다운로드 클래스 V1.0
// 출처: Dreamweaver Journey http://www.dedecms.com
//저자: IT Plato
//시간: 2005-11-13 12:39
//설명: Laggard 웹사이트에 처음 게시됨 , 다시 인쇄해 주세요. 저작권 정보 보유
---------------------------- --------- ---------- */
클래스 DedeHttpDown
{
$m_urlpath = " ";
var $m_scheme = "http";
var $m_host = "";
var $m_port = "80";
var $m_user = "";
var $m_pass = "";
var $m_path = "/";
var $m_fp = ""
var $ m_httphead = "" ;
var $m_html = "";
var $BaseUrlPath = ""
var $ JumpCount = 0;//다중 리디렉션이 무한 루프에 빠지는 것을 방지합니다
//
{
if($url=="") return
$urls = ""; $urls = @parse_url($url);
$this->m_url = $url;
if (is_array($urls))
url["scheme"])) $this-> ; m_scheme = $urls["scheme"];
_user = $urls["user"]
}
if(!empty($urls["pass"])){
$this->m_pass = $urls["pass"];
}
if(!empty($urls["port"])){
$this->m_port = $urls["port"];
}
if(!empty($urls["path"])) $this->m_path = $urls["path"];
$this->m_urlpath = $this->m_path;
if(!empty($urls["query"])){
$this->m_query = $urls["query"];
$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);
}
}
//
//打开指定网址
//
기능 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 = 배열() ;
//$this->m_puthead = "";
$this->m_html = "";
$this->Close();
//初始化系统
$this->PrivateInit($url);
$this->PrivateStartSession();
}
//
//打开303중정向网址
//
기능 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 = 배열() ;
$this->m_html = "";
$this->Close();
//初始化系统
$this->PrivateInit($url);
$this->PrivateStartSession();
}
//
//获得某操work错误적 원본
//
함수 printError()
에코 "错误信息:".$this-> ;m_오류;
에코 "具体返回头:
";
foreach($this->m_httphead as $k=>$v)
{ echo "$k => $v
rn"; }
}
//
//判别用 Get方法发送的头的应答结果是否수정确
// IsGetOK()
{
if( ereg( "^2",$this->GetHead("http-state")) )
{ return true; }
머리("http-describe") ."
";
텍스트 유형인지
//
함수 IsText()
{
if(ereg( "^2",$this->GetHead("http-state"))
&& eregi("^text",$this->GetHead ("content-type")))
~ ->m_error .= "콘텐츠가 텍스트 유형이 아니거나 URL 리디렉션입니다."
else
{
$this- >m_error .= "잘못된 유형".$this->GetHead("content-type")"
파일 다운로드
//
함수 SaveToBin($savefilename)
{ !"; return false;}
fwrite ($ fp, fread ($ this- & gt; m_fp, 1024));
반환 true;
} this- & gt; savebinfile (savebinfile) ( $savefilename);
else return "";
}
//
//Http 프로토콜을 사용하여 웹페이지 콘텐츠 가져오기 Function GetHtml()
{
(! $this->m_fp||@feof($this->m_fp)) return ""; = fgets($this->m_fp,256)
🎜> / 🎜> .= " 원격 호스트를 여는 동안 오류가 발생했습니다!";
~ false로 반환;
if($this->GetHead("http-edition")=="HTTP/1.1") $httpv = "HTTP/1.1";
else $httpv = "HTTP/1.0"; > //고정된 초기 요청 헤더 GET, 호스트 정보 보내기
~ ;m_puthead["Host"] = $this->m_host
> }
if(!isset($this->m_puthead["User-Agent"])) { $this->m_puthead[" User-Agent"] = "Mozilla/4.0(호환; MSIE 6.0; Windows NT 5.2)"; }
if(!isset($this->m_puthead["Refer"])) { $this-> m_puthead["Refer"] = "http://".$this- >m_puthead["호스트"]; }
foreach($this->m_puthead as $k=>$v){
$k ~ _fp, "$k: $vrn");
//HTTP1.1 프로토콜은 문서가 끝난 후 링크가 닫혀야 함을 지정해야 합니다. 그렇지 않으면 문서를 읽을 때 Feof를 사용하여
if ($ httpv == "http/1.1") FPuts ($ this-& gt; m_fp, "connection: closenrn") ;m_fp,"rn");
-> "] = 트림($httpstas[0]);
$this->m_httphead["http-state"] = trim($httpstas[1]);
>m_httphead["http-describe" ] = "";
for($i=2;$i
}
//获取详细应答头
while(!feof($this->m_fp)){
$line = trim (fgets($this->m_fp,256));
if($line == "") break;
$hkey = "";
$hvalue = "";
$v = 0;
for($i=0;$i
if($line[$i]==":") $v = 1;
if($v==0) $hkey .= $line[$i];
}
$hkey = trim($hkey);
if($hkey!="") $this->m_httphead[strtolower($hkey)] = trim($hvalue);
}
//判断是否是3xx开头的应答
if(ereg("^3",$this->m_httphead["http- 상태"]))
{
if($this->JumpCount > 3) return;
if(isset($this->m_httphead["location"])){
$newurl = $this->m_httphead["location"];
if(eregi("^http",$newurl)){
$this->JumpOpenUrl($newurl);
}
~ ~ > ~ 를 통해"; }
이름)
{
$headname = strto lower($headname);
if(isset($this->m_httphead[$headname]))
return $this- >m_httphead[$headname]; else
"" 반환
}
$
{
if($this ->m_host=="") false 반환
> ~ > @fclose($this->m_fp)
}
//
//补전체상상对网址
//
기능 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
$i ;
}
$urls = explode("/",$this->BaseUrlPath);
if(count($urls) <= $pathStep)
return"";
else{
$pstr = "http://";
for($i=0;$i
$okurl = $pstr.$dstr;
}
}
}
else
{
if(strlen($surl)<7)
$okurl = "http://".$this- >BaseUrlPath."/".$surl;
else if(strtolower(substr($surl,0,7))=="http://")
$okurl = $surl;
else
$okurl = "http://".$this->BaseUrlPath."/".$surl;
}
$okurl = eregi_replace("^(http://)","",$okurl);
$okurl = eregi_replace("/{1,}","/",$okurl);
'http://'.$okurl을 반환합니다.
}
}
?>
以上就介绍了sock 发布一个usePHP fsockopen写的HTTP下载的类,包括了sock way 内容,希望对PHP教程有兴趣 朋友有所帮助.