Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verwendet PHP denselben Domänennamen, um Remote-Webinhalte von mehreren IPs zu crawlen?

Wie verwendet PHP denselben Domänennamen, um Remote-Webinhalte von mehreren IPs zu crawlen?

伊谢尔伦
伊谢尔伦Original
2017-07-17 10:30:191358Durchsuche

Wenn derselbe Domänenname mehreren IPs entspricht, erhält die PHP-Funktion den Inhalt der Remote-Webseite
fgc liest ihn einfach und kapselt alle Vorgänge
fopen führt auch eine gewisse Kapselung durch, erfordert jedoch, dass Sie ihn lesen in einer Schleife Alle Daten abrufen.
fsockopen Dies ist eine geradlinige Socket-Operation.
Wenn Sie nur eine HTML-Seite lesen, ist fgc besser.
Wenn das Unternehmen über eine Firewall auf das Internet zugreift, funktioniert die allgemeine Funktion file_get_content nicht. Natürlich ist es auch möglich, HTTP-Anforderungen über einige Socket-Vorgänge direkt an den Proxy zu schreiben, dies ist jedoch problematischer.
Wenn Sie bestätigen können, dass die Datei klein ist, können Sie eine der beiden oben genannten Methoden wählen fopen,join('',file($file));. Wenn Sie beispielsweise nur Dateien kleiner als 1k betreiben, verwenden Sie am besten file_get_contents.
Wenn Sie sicher sind, dass die Datei groß ist, oder wenn Sie die Größe der Datei nicht bestimmen können, verwenden Sie am besten Dateistreams. Es gibt keinen offensichtlichen Unterschied zwischen dem Öffnen einer 1K-Datei und dem Öffnen einer 1G-Datei. Je länger der Inhalt, desto länger dauert das Lesen, anstatt das Skript sterben zu lassen.

PHP bietet viele Möglichkeiten, Remote-Webinhalte abzurufen, beispielsweise die Verwendung eigener Funktionen wie file_get_contents und fopen.

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

Beim Lastausgleich wie DNS-Polling kann derselbe Domänenname jedoch mehreren Servern und mehreren IPs entsprechen. Gehen Sie davon aus, dass http://php.cn/abc.php
durch DNS in drei IPs aufgelöst wird: 72.249.146.213, 72.249.146.214 und 72.249.146.215, jedes Mal, wenn der Benutzer http://php.cn/ besucht. abc.php, Das System greift gemäß dem entsprechenden Lastausgleichsalgorithmus auf einen der Server zu.
Als ich letzte Woche an einem Videoprojekt arbeitete, stieß ich auf eine solche Anforderung: Ich musste auf jedem Server auf ein PHP-Schnittstellenprogramm (angenommen abc.php) zugreifen, um den Übertragungsstatus abzufragen dieser Server. Derzeit können Sie file_get_contents nicht direkt verwenden, um auf http://php.cn/abc.php zuzugreifen, da es möglicherweise wiederholt auf einen bestimmten Server zugreift.
Durch den Besuch von http://72.249.146.213/abc.php, http://72.249.146.214/abc.php, http://72.249.146.215/abc.php nacheinander, auf diesen drei Servern Dies ist auch der Fall nicht möglich, wenn der Webserver auf dem Computer mit mehreren
virtuellen Hosts ausgestattet ist. Es ist nicht möglich, lokale Hosts festzulegen, da Hosts nicht mehrere IP-Adressen festlegen können, die demselben Domänennamen entsprechen.
Das kann nur über PHP- und HTTP-Protokolle erreicht werden: Fügen Sie beim Zugriff auf abc.php den Domänennamen php.cn zum Header hinzu. Also habe ich die folgende
PHP-Funktion geschrieben:

<?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"); 
 ?>
Verwenden Sie die fsockopen-Funktion, um die URL zu öffnen und die vollständigen Daten im POST-Modus zu erhalten, einschließlich Header und Text

Das obige ist der detaillierte Inhalt vonWie verwendet PHP denselben Domänennamen, um Remote-Webinhalte von mehreren IPs zu crawlen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn