Aller au contenu

fread - en terme de ressources ?


Sonia Gazil

Sujets conseillés

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 :

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

que de faire :

$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.

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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.

$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 ?

Lien vers le commentaire
Partager sur d’autres sites

Précisions sur la doc PHP ;)

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.
Modifié par dièse
Lien vers le commentaire
Partager sur d’autres sites

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.

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 ?

<{POST_SNAPBACK}>

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.

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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 ;)

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.

Lien vers le commentaire
Partager sur d’autres sites

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 ;)

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.

<{POST_SNAPBACK}>

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

$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" ;)

Lien vers le commentaire
Partager sur d’autres sites

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 ?

<{POST_SNAPBACK}>

Desole, je n'utilise pas cet OS (chanceux que je suis :D ). Je laisse donc repondre les specialistes ...

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...