Maison  >  Article  >  développement back-end  >  Comment PHP utilise-t-il le même nom de domaine pour explorer le contenu Web distant à partir de plusieurs adresses IP ?

Comment PHP utilise-t-il le même nom de domaine pour explorer le contenu Web distant à partir de plusieurs adresses IP ?

伊谢尔伦
伊谢尔伦original
2017-07-17 10:30:191359parcourir

Lorsque le même nom de domaine correspond à plusieurs IP, la fonction de PHP pour obtenir le contenu de la page Web distante
fgc le lit simplement et encapsule toutes les opérations
fopen effectue également une certaine encapsulation, mais cela vous oblige à le lire en boucle Obtenez toutes les données.
fsockopen Il s'agit d'une opération de socket en ligne droite.
Si vous venez de lire une page html, fgc est meilleur.
Si l'entreprise accède à Internet via un pare-feu, la fonction générale file_get_content ne fonctionnera pas. Bien sûr, il est également possible d'écrire directement des requêtes http sur le proxy via certaines opérations de socket, mais c'est plus gênant.
Si vous pouvez confirmer que le fichier est petit, vous pouvez choisir l'une des deux méthodes ci-dessus fopen,join('',file($file));. Par exemple, si vous n'exploitez que des fichiers de taille inférieure à 1 Ko, il est préférable d'utiliser file_get_contents.
Si vous êtes sûr que le fichier est volumineux, ou si vous ne pouvez pas déterminer la taille du fichier, il est préférable d'utiliser des flux de fichiers. Il n’y a pas de différence évidente entre ouvrir un fichier 1K et ouvrir un fichier 1G. Plus le contenu est long, plus il faut de temps pour le lire, plutôt que de laisser le script mourir.

PHP dispose de nombreuses façons d'obtenir du contenu Web distant, par exemple en utilisant ses propres fonctions telles que file_get_contents et fopen.

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

Cependant, dans l'équilibrage de charge tel que le sondage DNS, un même nom de domaine peut correspondre à plusieurs serveurs et plusieurs IP. Supposons que http://php.cn/abc.php
soit résolu par DNS en trois adresses IP : 72.249.146.213, 72.249.146.214 et 72.249.146.215 chaque fois que l'utilisateur visite http://php.cn/. abc.php, Le système accédera à l'un des serveurs selon l'algorithme d'équilibrage de charge correspondant.
Lorsque je travaillais sur un projet vidéo la semaine dernière, j'ai rencontré une telle exigence : je devais accéder à un programme d'interface PHP (supposé être abc.php) sur chaque serveur afin d'interroger le état de transmission de ce serveur.
Pour le moment, vous ne pouvez pas utiliser directement file_get_contents pour accéder à http://php.cn/abc.php, car il peut continuer à accéder à un certain serveur à plusieurs reprises.
En visitant http://72.249.146.213/abc.php, http://72.249.146.214/abc.php, http://72.249.146.215/abc.php dans l'ordre, dans ces trois serveurs C'est aussi Ce n'est pas possible lorsque le serveur Web de l'ordinateur est équipé de plusieurs hôtes virtuels.
Il n'est pas possible de définir des hôtes locaux, car les hôtes ne peuvent pas définir plusieurs IP correspondant au même nom de domaine.
Cela ne peut être réalisé que via les protocoles PHP et HTTP : lors de l'accès à abc.php, ajoutez le nom de domaine php.cn à l'en-tête. J'ai donc écrit la Fonction PHP suivante :

<?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"); 
 ?>

Utilisez la fonction fsockopen pour ouvrir l'url et obtenir les données complètes en mode POST, y compris l'en-tête et le corps

<?
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();
?>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn