Charger un fichier sur un serveur web est une opération de base de tout navigateur internet. En PHP, la fonction
file_get_contents() ou encore l'extension
curl facilitent
le chargement de contenu.
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.0\r\n"; //
$out .= "Host: ".$urlpart['host']."\r\n";
$out .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17\r\n";
$out .= "Connection: Close\r\n\r\n";
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,"\r\n\r\n");
if ($p!==false) {
$buf= substr($buf, $p);
}
/****************************************
* Enregistrer le code HTML dans un fichier
****************************************/
$ft = fopen ($filename, "a");
fputs ($ft, $buf);
fclose ($ft);
}
}
}
?>
Note: la redirection n'est pas traitée.
ExempleEnregistrer le code HTML de la page d'accueil dans le fichier tmp.html
FileGetContent::save('http://www.fobec.com/CMS/index.php', $_SERVER['DOCUMENT_ROOT'].'/tmp.html');