Version complète: sur le forum Webmaster Hub : fread - en terme de ressources ?
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
Sonia Gazil
Bonjour,

D'après plusieurs bench, on voit que utiliser fread est plus rapide que file_get_contents. Et toujours en utilisant fread, il est plus rapide de faire :

CODE
$fp = fopen ($filename, "r");
$contents = fread ($fp, filesize ($filename));
fclose ($fp);


que de faire :

CODE
$fp = fopen($filename, "r");
$contents = '';

while ( !feof($fp) ) {
 $contents .= fread($fp, 1024);
}

fclose($fp);



Mais en terme d'utilisation ressources au niveau du serveur, y'a t'il une différence ?
Car si mon fichier fait 1 000 000 octets, je suppose que la première méthode va charger d'un coup tous ces octets en mémoire. Même si cela est plus rapide, ça ne risque pas de surcharger le serveur ? Et quant est t'il pour la seconde ?


Je me doute que ma question est assez fine, et je sais du tout si quelqu'un pourra me répondre clairement et avec certitude. Mais je vous remercie tout de même de m'avoir lu.

Bonne soirée.
destroyedlolo
A mon avis, la seconde solution est legerement plus lente car
  • il devra allouer la memoire en plusieurs fois vu qu'il ne charge qu'1 ko a la fois. Avec la premiere solution, il pourrait tout allouer d'un coup.
  • il y a du code PHP a interprete alors qu'avec la solution, tout se fait au niveau C
Au niveau memoire, au final tout sera charge en memoire donc les 2 solutions auront le meme impacte sur le serveur.
Sonia Gazil
Oui, car je stockais tout dans une variable.
Mais imaginons que maintenant j'ai une fonction qui traite ma chaine. Une fois cette fonction executée, je n'ai plus besoin de concerver les données retournées par fread.

CODE
$fp = fopen($filename, "r");
$contents = '';

while ( !feof($fp) ) {
traitement_de_ma_chaine(fread($fp, 1024));
// A partir de maintenant, je n'ai plus besoin de ce que je viens de récupérer
}

fclose($fp);


Mais la question est : ce que je viens de récupérer reste il en mémoire ? Comment le vérifier ? Comment savoir exactement la mémoire utilisée par un script php ?
dièse
Précisions sur la doc PHP wink.gif

CITATION
file_get_contents() is the preferred way to read the contents of a file into a string. It will use memory mapping techniques if supported by your OS to enhance performance.
destroyedlolo
CITATION(Sonia Gazil @ dimanche 19 février 2006, 21h49)
Oui, car je stockais tout dans une variable.
Mais imaginons que maintenant j'ai une fonction qui traite ma chaine. Une fois cette fonction executée, je n'ai plus besoin de concerver les données retournées par fread.


Ben, dans ce cas la, il est evident que la seconde solution utilisera moins la RAM.
Ca peut etre un gains de temps et de statilite pour les gros fichiers.

CITATION(Sonia Gazil @ dimanche 19 février 2006, 21h49)
Mais la question est : ce que je viens de récupérer reste il en mémoire ? Comment le vérifier ? Comment savoir exactement la mémoire utilisée par un script php ?
*


Si ton script peut etre lancer par le Shell (CLI), il suffit simplement d'utiliser un outils de profiling ...
S'il ne peut etre lance que par un serveur web, il faut d'abord determine le nom du process HTTP qui execute le script, et ensuite le monitorer.
C'est plus complique.
Sonia Gazil
dièse :

Oui mais, d'après mes derniers tests, file_get_contents est plus lent que fread. Mais justement, j'aurais aimé faire des tests au niveau de la mémoire utiliée.

En effet, je me suis rendue compte que des fonctions affichaient de meilleures temps lors des tests effectués par un developpeur, seul face à sa machine. Mais, paradoxalement, elles sont beaucoup plus lentes lorsqu'elles sont appellées simultanément par plusieurs visiteurs...



destroyedlolo :

Je dois avouer que ma recherche sur la toile n'a pas été très fructueuse.
Je développe sous windows XP, peux tu m'en dire davantage sur la marche à suivre pour connaitre la mémoire utilisée par un script ?
TheRec
Bonjour,

Voici un test des performances des fonctions évoquée dans ce sujet, à vous d'en tirer les conclusions qui s'imposent : http://www.phplibrairies.com/tutorial_2_pa...2fc4bf39b7e14b1
Personnellement j'aurais un net penchant pour écouter ce que les personne qui ont créé un langage lorsqu'il s'agit d'optimisation wink.gif

PS: Un complément, si tu regardes la première page de l'article mentionné ci-dessus, cela correspond à une requête sur un serveur distant.
petit-ourson
Et si on lisait le fichier ainsi :

<?php

ob_start();
require("monfichieralire");
$contenu = string ob_get_contents();
ob_end_clean();

?>

Les includes et requires doivent être bien optimisés non ?
Sonia Gazil
CITATION(TheRec @ lundi 20 février 2006, 18h10)
Bonjour,

Voici un test des performances des fonctions évoquée dans ce sujet, à vous d'en tirer les conclusions qui s'imposent : http://www.phplibrairies.com/tutorial_2_pa...2fc4bf39b7e14b1
Personnellement j'aurais un net penchant pour écouter ce que les personne qui ont créé un langage lorsqu'il s'agit d'optimisation wink.gif

PS: Un complément, si tu regardes la première page de l'article mentionné ci-dessus, cela correspond à une requête sur un serveur distant.
*



J'avais réalisé de nombreux tests, et la solution avec fopen et fread était la plus rapide.

CODE
$fd = fopen ('bench_wd.php', 'r');
$p = fread ($fd, filesize ('bench_wd.php'));
fclose ($fd);



Mais je souhaitais vérifier ce qu'il en était au niveau "mémoire" et "charge utilisée sur le serveur" wink.gif
destroyedlolo
CITATION(Sonia Gazil @ lundi 20 février 2006, 17h53)
destroyedlolo :

Je dois avouer que ma recherche sur la toile n'a pas été très fructueuse.
Je développe sous windows XP, peux tu m'en dire davantage sur la marche à suivre pour connaitre la mémoire utilisée par un script ?
*


Desole, je n'utilise pas cet OS (chanceux que je suis biggrin.gif ). Je laisse donc repondre les specialistes ...
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.