Charger une page HTML avec les sockets
La class FileGetContent reprend une à une les fonctions pour communiquer avec un serveur web:- Ouvrir une connexion avec fsockopen,
- Envoyer la commande GET au serveur web,
- Ecouter le port 80 et réceptionner les données
- Enregistrer le code HTML dans un fichier.
<?php
/******************************************************************************
* Enregistrer une page internet dans un fichier
* @copyright Fobec 2011
******************************************************************************/
class FileGetContent {
static public function save($url,$filename) {
/****************************************
* Décomposer l'url
****************************************/
$urlpart=parse_url($url);
if (!isset($urlpart['host'])) {
throw new Exception("Invalid URL");
}
/****************************************
* Ouvrir une connexion
****************************************/
$fp = fsockopen($urlpart['host'], 80);
if (!$fp) {
throw new Exception("Socket not open");
} else {
$path='/';
if (isset($urlpart['path'])) {
$path=$urlpart['path'];
}
/****************************************
* Envoyer la commande GET au serveur
****************************************/
$out = "GET ".$path." HTTP/1.0rn"; //
$out .= "Host: ".$urlpart['host']."rn";
$out .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17rn";
$out .= "Connection: Closernrn";
fwrite($fp, $out);
/****************************************
* Ecouter le port 80 et receptionner les données
****************************************/
$buf='';
while (!feof($fp)) {
$buf.=fgets($fp);
}
fclose($fp);
/****************************************
* Effacer le header
****************************************/
$p=strpos($buf,"rnrn");
if ($p!==false) {
$buf= substr($buf, $p);
}
/****************************************
* Enregistrer le code HTML dans un fichier
****************************************/
$ft = fopen ($filename, "a");
fputs ($ft, $buf);
fclose ($ft);
}
}
}
?>
Enregistrer une page HTML
Comment enregistrer le code HTML de la page d'accueil dans le fichier tmp.html. La class automatise les fonctions suivants:- ouverture d'une connexion avec le serveur distant,
- envoi de la requête HTTP,
- réception puis enregistrement du code source.
<?php
FileGetContent::save('http://www.fobec.com/CMS/index.php', $_SERVER['DOCUMENT_ROOT'].'/tmp.html');
?>
La class illustre une communication client-serveur avec les sockets. Dans notre cas, le contenu de la page HTML est enregistré dans un fichier.
Le script est à utiliser avec précaution car il ne gère pas les timeout, les redirections et les codes d'erreur.