Si on passe une URL à la fonction fopen(), on peut ouvrir un fichier situé sur un autre serveur sur le réseau Internet.

On utilisera ensuite les fonctions :

- fgets() qui renvoie une ligne du fichier,
- feof() qui teste la fin de fichier,
- fclose() qui ferme le fichier.

L'exemple suivant ouvre et lit la page d'accueil du site www.php.net.

Remarque : pour tester l'exemple, vous devez avoir une connection Internet ouverte.

Exemple : lire un fichier sur Internet
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Lire un fichier sur Internet'); $nom = 'http://www.php.net/'; // Ouverture du fichier $fichier = fopen($nom, 'r'); if ($fichier === FALSE) { htmlInfo("$nom n'est pas accessible"); htmlFin(); exit(); } // Lecture du fichier $buffer = ''; while (! feof($fichier)) { $buffer .= fgets($fichier); } // Fermeture du fichier fclose($fichier); // Affichage du buffer htmlInfo("Contenu du fichier $nom"); echo htmlentities($buffer); htmlFin(); ?>

Pour afficher le contenu du fichier nous utilisons la fonction htmlentities(), sinon ce contenu qui est du code HTML serait interprété par le navigateur, et non pas affichée comme du texte.

Le fait de pouvoir ouvrir un fichier sur Internet, ne garantit pas que ce fichier existe réellement car le plus souvent, les serveurs Web ont un mécanisme de personnalisation d'erreur qui affiche une page si l'url demandée n'est pas bonne.

L'exemple suivant essaye de lire le fichier www.php.net/quelaforcesoitavectoi.html, qui bien sûr n'existe pas (enfin, je pense). Le serveur fait une redirection sur une page signalant l'erreur et proposant une recherche. L'exemple affiche d'abord le code HTML retourné, puis le code interprétée.

Remarque : pour tester l'exemple, vous devez avoir une connection Internet ouverte.

Exemple : lire un fichier sur Internet
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Lire un fichier sur Internet'); $nom = 'http://www.php.net/quelaforcesoitavectoi.html'; // Ouverture du fichier $fichier = fopen($nom, 'r'); if ($fichier === FALSE) { htmlInfo("$nom n'est pas accessible"); htmlFin(); exit(); } // Lecture du fichier $buffer = ''; while (! feof($fichier ) ) { $buffer .= fgets($fichier); } // Fermeture du fichier fclose($fichier); // Affichage du fichier htmlInfo("Contenu du fichier $nom"); htmlInfo('Contenu non interprété'); echo htmlentities($buffer); htmlInfo('Contenu interprété'); echo $buffer; htmlFin(); ?>

Si le fichier n'existe pas et qu'aucun mécanisme de redirection n'est mis en place on obtient le résultat suivant.

Exemple : lire un fichier sur Internet
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Lire un fichier sur Internet'); $nom = 'http://www.francoispiat.fr/xxxxxx.html'; // Ouverture du fichier $fichier = fopen($nom, 'r'); if ($fichier === FALSE) { htmlInfo("$nom n'est pas accessible"); htmlFin(); exit(); } htmlFin(); ?>

Pour éviter l'affichage du message d'erreur on peut préfixer fopen() avec l'opérateur de masquage @.

Exemple : lire un fichier sur Internet
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Lire un fichier sur Internet'); $nom = 'http://www.francoispiat.fr/xxxxxx.html'; // Ouverture du fichier $fichier = @fopen($nom, 'r'); if ($fichier === FALSE) { htmlInfo("$nom n'est pas accessible"); htmlFin(); exit(); } htmlFin(); ?>

D'une façon générale, je vous conseille de toujours préfixer fopen() avec l'opérateur de masquage @.

Quand on ouvre un fichier sur Internet, on récupère le tableau $http_response_header (qui n'est pas commenté dans la documentation PHP). Ce tableau contient toutes les en-têtes HTTP renvoyées par le serveur sur lequel on a ouvert le fichier.

Remarque : pour tester l'exemple, vous devez avoir une connection Internet ouverte.

Exemple : lire un fichier sur Internet
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Contenu du tableau des en-têtes HTTP'); $nom = 'http://www.php.net/'; // Ouverture du fichier $fichier = @fopen($nom, 'r'); if ($fichier === FALSE) { htmlInfo("$nom n'est pas accessible"); htmlFin(); exit(); } // Fermeture du fichier fclose($fichier); foreach($http_response_header as $entete) { htmlInfo('En-tete'); echo $entete; } htmlFin(); ?>