Lecture de fichier

© Christian PAULUS. Document créé le 1er mai 2005 , mis à jour le 8 juillet 2007.

Si perçante soit la vue, on ne se voit jamais de dos. Proverbe chinois

Accueil du site > Astuces > PHP > Lecture de fichier

Benchmark / PHP 4.3.0

Petit exercice de style : comparatif de traitements en lecture d’un fichier ASCII et nettoyage.

Objectif : lire un fichier ASCII de taille respectable - prés de 800 Ko dans le cas présenté - et lui retirer tous les blancs inutiles. Comparer les diverses fonctions PHP disponibles.

Pour la lecture du fichier, trois fonctions sont créées et comparées :

kzo_fgets : qui utilise la fonction PHP fgets () disponible à partir de PHP 3 :

<?php
    
function kzo_fgets ($filename, &$buffer) {
        if (
file_exists ($filename)) {
            if (
$handle fopen ($filename"r")) {
                while (!
feof ($handle)) {
                    
$buffer .= fgets($handleMAXLENBUFFER);
                }
                
fclose ($handle);
            } else {
                
$buffer $filename." unreadable.";
                return (
FALSE);
            }
        } else {
            
$buffer $filename." not found.";
            return (
FALSE);
        }
        return (
TRUE);
    }
?>

kzo_file : qui utilise la fonction PHP file () disponible à partir de PHP 3 :

<?php
    
function kzo_file ($filename, &$buffer) {
        if (
file_exists ($filename) && is_readable ($filename)) {
            if (
$buffer file ($filename)) {
                return (
TRUE);
            } else {
                
$buffer $filename." unreadable.";
                return (
FALSE);
            }
        } else {
            
$buffer $filename." not found or unreadable.";
            return (
FALSE);
        }
    }
?>

kzo_file_get_contents : qui utilise la fonction PHP file_get_contents () disponible à partir de PHP 4.3.0 :

<?php
    
function kzo_file_get_contents ($filename, &$buffer) {
        if (
file_exists ($filename) && is_readable ($filename)) {
            if (
$buffer file_get_contents ($filename)) {
                return (
TRUE);
            } else {
                
$buffer $filename." unreadable.";
                return (
FALSE);
            }
        } else {
            
$buffer $filename." not found or unreadable.";
            return (
FALSE);
        }
    }
?>

fgets () permet la lecture séquentielle. Il faut ici ouvrir le fichier, récupérer les lignes en parcourant le fichier, et fermer le fichier. file () lit le fichier directement - pas besoin de l’ouvrir - et renvoie le résultat dans un tableau. file_get_contents () ressemble à file () mais renvoie tout le fichier dans une chaîne de caractères. Je vous laisse lire la documentation PHP pour plus de détails à propos de ces trois fonctions.

Dans les sources kzo_fgets (), kzo_file () et kzo_file_get_contents () est ajoutée la gestion des erreurs. Chacune de ces fonctions renvoie TRUE si tout se passe correctement, sinon FALSE. Dans le cas de FALSE, le message d’erreur est recopié dans la variable envoyée en appel ($buffer dans ces cas).

Pour le comparatif, utilisons un fichier texte d’environ un méga-octet, tel que le fichier bookmark.html de Firefox (exportation des bookmarks que vous pouvez obtenir dans la fenêtre de gestion des bookmarks). Ce fichier a l’avantage de présenter de nombreuses lignes très longues, avec de nombreux espaces répétés. Nous l’utiliserons dans l’exemple sur la manipulation de chaînes.

Nous pouvons maintenant tester la performance de ces fonctions par un simple appel du style :

<?php
    $filename 
"bookmark.html";
    
$time_start getmicrotime(); 
    
$buffer ""
    print (
kzo_file_get_contents ($filename$buffer) ? getmicrotime() - $time_start $buffer);
?>

sur le fichier bookmark.html pris pour l’exemple.

Les résultats (moyenne sur trois affichages successifs) qui peuvent être bien différents sur votre environnement :

* kzo_fgets () : 0,057 sec. ; * kzo_file () : 0,027 sec. ; * kzo_file_get_contents () : 0,016 sec.

C’est donc kzo_file_get_contents () qui paraît le plus efficace. On pouvait aisément se douter que kzo_fgets () serait la moins performante.

Plussoyez !

Les forums sont fermés.