[PHP] Gestion de la mémoire - Version imprimable +- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org) +-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38) +--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51) +--- Sujet : [PHP] Gestion de la mémoire (/showthread.php?tid=4396) |
[PHP] Gestion de la mémoire - Argorate - 09-10-2009 Bonjour, J'aurais aimer savoir - par curiosité - où trouver ou qu'on m'explique comment fonctionne la gestion de la mémoire du langage php. En effet les types n'étant pas gérer au niveau du programmeur, comment cela fonctionne dans les couche inférieur? L'allocation et la libération de la mémoire, les pointeurs, tout ça... comment ça fonctionne? En gros: "Qui" le gère et comment? Voilà, Merci. RE: [php] gestion memoire - My Hotel - 09-10-2009 Honnêtement, je me suis jamais penché la dessus. Si je programme en PHP, je me fous de savoir comment ça fonctionner derrière, si je veux du bas-niveau, ben je change de langage Après, je comprends ta curiosité Le meilleur moyen, c'est de lire le code source de PHP :omg: Je laisse les autres te répondre, parce qu'en plus le web fourmille pas de réponses... Peut-être ça : http://blog.pascal-martin.fr/post/php-5.3-garbage-collector-vs-consommation-memoire, et encore, c'est sur un point de détail. Bye RE: [php] gestion memoire - QuentinC - 09-10-2009 A ce que je sache, php possède son garbage collector, enfin ça ne s'appelle pas comme ça en php mais le principe reste le même. RE: [php] gestion memoire - Kassak - 09-10-2009 Peut être faut il allez voir du coté de L'ASCII ? Chaque caractère d'un script doit peser un certain nombre d'octet... Je suis sûrement HS là mais bon... ^^ RE: [php] gestion memoire - Argorate - 09-10-2009 my hotel: oui c'est vraiment pour savoir s'il y aurait des "bonnes" pratiques en fonction de comment ça marche en dessous... Kassak: c'est un peu plus compliquer que ça. ^^ Normalement pour gèrer les espaces mémoires, on met a chaque début de cases mémoires des informations sur celle-ci (taille, pointeur etc.) RE: [PHP] Gestion de la mémoire - DragonMaster - 12-10-2009 Bah je ne m'y suis pas trop penché, mais comme la tous les langages non typé, c'est fait via des pointeurs. En fait, lorsque tu remplis ta variable en arrière le code détermine le type de ta variable et créer un int par exemple si tu mets 22. Ensuite, si tu change le contenu pour du texte la variable est supprimée et on crée une variable char [] (ou bien on utilise une librairie STL ou autre qui gère les chaines, mais déjà je pense que PHP à sa propre librairie de string). RE: [PHP] Gestion de la mémoire - Allwise - 12-10-2009 Le lien de My Hotel dit le plus important, et il fourmille d'autres liens tout aussi intéressants, bien joué My Hotel RE: [PHP] Gestion de la mémoire - naholyr - 12-10-2009 [disclaimer]j'avais pas suivi le lien fourni par MyHotel, mais en fait je raconte la même chose que ce qu'ils disent là-bas. Par contre je ne suis pas d'accord sur le fait que c'est "un point de détail" même si ça ne concerne que des scripts un peu particuliers comme il est facile de s'en prémunir autant le faire [/disclaimer] Tout ce qu'il faut, c'est éviter les références croisées, et tu n'auras pas de problème. En revanche, il faut faire bien attention de ne pas croire que ce type de code peut fonctionner ad vitam aeternam : Code PHP :
Code PHP :
En reprenant l'exemple ci-dessus et en ajoutant une fonction __destruct() on se rend encore mieux compte de ce qui se passe, vous vous apercevrez que __destruct() n'est même pas appelé malgré l'unset !! Comme $b embarque $a, lorsqu'on unset($a), il reste une référence vers l'objet ($b->a) et l'objet n'est donc pas détruit. Puis on essaie d'unset($b), mais comme $a n'a pas été détruit, il reste une référence vers l'objet ($a->b) et il n'est pas détruit non plus. S'il n'y avait pas la référence croisée (mettons que $a->b n'existe pas) alors on aurait un scénario différent : j'essaie d'unset($a), ça ne détruit pas l'objet car il reste une référence vers l'instance en la personne de $b->a. Mais par contre au moment d'unset($b) là comme il n'y a plus de référence vers l'instance $b, l'objet est effectivement détruit, donc $b->a est unset, et comme c'était la dernière référence vers notre instance de A l'objet est enfin supprimé. Cela peut être important de maîtriser ces concepts quand on a de gros calculs qui imposent la création d'un nombre important d'objets, ou tout simplement un script de type "daemon". La seule règle à respecter est *pas de références circulaires* et tout ira bien Il parait que la 5.3 corrige en partie ça (mais comme ils ont une regression pourrie sur __toString(), je suis pas pret de l'adopter). Et pour ceux qui pensent que ça ne viendrait à l'esprit de personne de faire ce type de référence croisée, ça vous semblera peut-être moins abstrait là : Code PHP :
Code PHP :
|