>백엔드 개발 >PHP 튜토리얼 >sock은 PHP fsockopen으로 작성된 HTTP 다운로드 클래스를 게시합니다.

sock은 PHP fsockopen으로 작성된 HTTP 다운로드 클래스를 게시합니다.

WBOY
WBOY원래의
2016-07-29 08:36:27954검색

원격 콘텐츠를 여는 옵션이 지원되면 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 $this->m_httphead["http- explain"] .= " ".trim ($httpstas[$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($v==1) $hvalue .= $line[$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          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(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教程有兴趣 朋友有所帮助.

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