>  기사  >  백엔드 개발  >  PHP는 어떻게 동일한 도메인 이름을 사용하여 여러 IP에서 원격 웹 콘텐츠를 크롤링합니까?

PHP는 어떻게 동일한 도메인 이름을 사용하여 여러 IP에서 원격 웹 콘텐츠를 크롤링합니까?

伊谢尔伦
伊谢尔伦원래의
2017-07-17 10:30:191359검색

동일한 도메인 이름이 여러 IP에 해당하는 경우 원격 웹 페이지의 콘텐츠를 가져오는 PHP의 기능
fgc는 단순히 이를 읽고 모든 작업을 캡슐화합니다.
fopen도 일부 캡슐화를 수행하지만 모든 것을 가져오려면 루프를 읽어야 합니다. 데이터.
fsockopen 이것은 직선 소켓 작업입니다.
HTML 페이지만 읽는다면 fgc가 더 좋습니다.
회사에서 방화벽을 통해 인터넷에 접속하는 경우 일반 file_get_content 기능이 작동하지 않습니다. 물론 일부 소켓 작업을 통해 프록시에 http 요청을 직접 쓰는 것도 가능하지만 더 번거롭습니다.
파일이 작은 것을 확인할 수 있다면 위의 두 가지 방법인 fopen,join('',file($file)); 중 하나를 선택할 수 있습니다. 예를 들어 1k보다 작은 파일만 조작한다면 file_get_contents를 사용하는 것이 가장 좋습니다.
파일이 크다고 확신하거나 파일 크기를 확인할 수 없는 경우 파일 스트리밍을 사용하는 것이 가장 좋습니다. 1K 파일을 여는 것과 1G 파일을 여는 것 사이에는 뚜렷한 차이가 없습니다. 콘텐츠가 길어질수록 스크립트가 죽지 않고 읽는 데 시간이 더 걸립니다.

PHP에는 file_get_contents 및 fopen과 같은 자체 기능을 사용하는 등 원격 웹 콘텐츠를 얻는 다양한 방법이 있습니다.

<?php 
echo file_get_contents("http://php.cn/abc.php");
?>

그러나 DNS 폴링과 같은 로드 밸런싱에서는 동일한 도메인 이름이 여러 서버, 여러 IP에 해당할 수 있습니다. 사용자가 http://php.cn/abc에 액세스할 때마다 http://php.cn/abc.php
가 DNS에 의해 72.249.146.213, 72.249.146.214 및 72.249.146.215의 세 가지 IP로 확인된다고 가정합니다. php를 사용하면 시스템은 해당 로드 밸런싱 알고리즘에 따라 서버 중 하나에 액세스합니다.
지난주에 비디오 프로젝트를 진행하면서 다음과 같은 요구 사항에 직면했습니다. 이 서버의 전송 상태를 쿼리하려면 각 서버의 PHP 인터페이스 프로그램(abc.php로 가정)에 액세스해야 했습니다.
현재 file_get_contents를 사용하여 http://php.cn/abc.php에 직접 접속할 수 없습니다. 특정 서버에 계속해서 반복적으로 접속할 수 있기 때문입니다.
http://72.249.146.213/abc.php, http://72.249.146.214/abc.php, http://72.249.146.215/abc.php를 차례로 방문하면 이 세 서버에서는 이 또한 불가능합니다. 웹 서버에 여러 개의 가상 호스트가 장착된 경우.
호스트는 동일한 도메인 이름에 해당하는 IP를 여러 개 설정할 수 없기 때문에 로컬 호스트 설정으로는 작동하지 않습니다.
그러면 PHP 및 HTTP 프로토콜을 통해서만 달성할 수 있습니다. abc.php에 액세스할 때 헤더에 php.cn 도메인 이름을 추가하세요. 그래서 저는 다음과 같은 PHP 함수를 작성했습니다:

<?php
 /************************
 * 函数用途:同一域名对应多个IP时,获取指定服务器的远程网页内容
 * 参数说明:
 * $ip服务器的IP地址
 * $host服务器的host名称
 * $url服务器的URL地址(不含域名)
 * 返回值:
 * 获取到的远程网页内容
 * false访问远程网页失败
 ************************/
function HttpVisit($ip, $host, $url) 
{ 
$errstr = &#39;&#39;; 
$errno = &#39;&#39;; 
$fp = fsockopen ($ip, 80, $errno, $errstr, 90); 
if (!$fp) 
{ 
 return false; 
} 
else
{ 
$out = "GET {$url} HTTP/1.1\r\n"; 
$out .= "Host:{$host}\r\n"; 
$out .= "Connection: close\r\n\r\n"; 
fputs ($fp, $out);

while($line = fread($fp, 4096)){ 
$response .= $line; 
} 
fclose( $fp );
//去掉Header头信息
$pos = strpos($response, "\r\n\r\n"); 
$response = substr($response, $pos + 4);
return $response; 
} 
 }
 //调用方法:
 $server_info1 = HttpVisit("72.249.146.213", "php.cn", "/abc.php"); 
 $server_info2 = HttpVisit("72.249.146.214", "php.cn", "/abc.php"); 
 $server_info3 = HttpVisit("72.249.146.215", "php.cn", "/abc.php"); 
 ?>

fsockopen 함수를 사용하여 URL을 열고 POST 모드에서 헤더와 본문을 포함한 전체 데이터를 얻습니다

<?
functionHTTP_Post($URL,$data,$cookie,$referrer=""){
// parsing the given URL
$URL_Info=parse_url($URL);
// Building referrer
if($referrer=="")// if not given use this script. as referrer
$referrer="111";
// making string from $data
foreach($dataas$key=>$value)
$values[]="$key=".urlencode($value);
$data_string=implode("&",$values);
// Find out which port is needed - if not given use standard (=80)
if(!isset($URL_Info["port"]))
$URL_Info["port"]=80;
// building POST-request:
$request.="POST ".$URL_Info["path"]." HTTP/1.1\n";
$request.="Host: ".$URL_Info["host"]."\n";
$request.="Referer:$referer\n";
$request.="Content-type: application/x-www-form-urlencoded\n";
$request.="Content-length: ".strlen($data_string)."\n";
$request.="Connection: close\n";
$request.="Cookie:$cookie\n";
$request.="\n";
$request.=$data_string."\n";
$fp=fsockopen($URL_Info["host"],$URL_Info["port"]);
fputs($fp,$request);
while(!feof($fp)){
$result.=fgets($fp,1024);
}
fclose($fp);
return$result;
}
printhr();
?>

위 내용은 PHP는 어떻게 동일한 도메인 이름을 사용하여 여러 IP에서 원격 웹 콘텐츠를 크롤링합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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