JeuWeb - Crée ton jeu par navigateur
Avez-vous déjà testé la mémoire que prenait PHP avec vos script ? - 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 : Avez-vous déjà testé la mémoire que prenait PHP avec vos script ? (/showthread.php?tid=4879)

Pages : 1 2 3 4 5 6


RE: Avez-vous déjà testé la mémoire que prenait PHP avec vos script ? - pascal - 08-06-2010

J'ai fait un tuto montrant les avantages à passer à la POO :
http://wiki.jeuweb.org/tutoprog/passage_a_la_poo

Mais on peut toujours continuer à coder comme on veut, POO, framework, procédural ...

L'important c'est d'avoir un jeu à la fin Smile

++

Pascal


RE: Avez-vous déjà testé la mémoire que prenait PHP avec vos script ? - Argorate - 08-06-2010

(08-06-2010, 05:45 PM)pascal a écrit : peut toujours continuer à coder comme on veut, POO, framework, procédural ...

L'important c'est d'avoir un jeu à la fin Smile
+1, suis tout a fait d'accord, ce qui compte c'est d'essayé d'avoir un jeu (si possible bien fait et qui tienne la route). Et je souhaite a toutes et a tous pour que le futur votre marche! ^^

Pour ce qui est de l'article, je préfère pas commencer à débattre sinon on en finira jamais Big Grin


RE: Avez-vous déjà testé la mémoire que prenait PHP avec vos script ? - srm - 08-06-2010

Belle initiative Pascal, mais dans l'exemple cité, je préfère carrément le faire en procédural, l'objet n'a aucune valeur ajouté dans ce cas pour moi.


RE: Avez-vous déjà testé la mémoire que prenait PHP avec vos script ? - Thib4s - 08-06-2010

(08-06-2010, 03:42 PM)Argorate a écrit : J'ai eut un aperçu de cakephp avec un intervenant extérieur le temps d'une journée, et là seule chose que ça m'a inspiré c'est que c'était une horreur sans nom... (Peut être que d’autres framework sont mieux, mais je préfère coder moi-même de toute façon).
Cela dépend de ce qu'on ta montré (a) La première fois qu'un ami me l'a présenté en me montrant son projet j'ai fait BEURK (codait aussi bien qu'un veau astigmate)
Maintenant je pense que dans le domaine des FW, CakePHP est peut être un des seuls qui permet de faire du procéduriel si on en a envie (vous verrez dans mon tuto qui est en préparation) ou bien de la POO. Donc dire je veux pas de framework parce que je touche rien en POO est un peu bidon... Dit en passant et un peu HS


RE: Avez-vous déjà testé la mémoire que prenait PHP avec vos script ? - php_addict - 08-06-2010

(08-06-2010, 03:42 PM)Argorate a écrit : Tant pis pour le point Godwin:

interessant ce lien

bon... désolé d'avoir susciter tant de discorde...

une derniere question sur le sujet "Avez-vous déjà testé la mémoire que prenait PHP avec vos script ?" : et notament sur:

Sephi-Chan a écrit :Ensuite, économiser les ressources processeur, c'est effectivement plus écologique : un processeur au repos consomme moins.

comment économiser les ressources du processeur? rapidité d'execution ?


RE: Avez-vous déjà testé la mémoire que prenait PHP avec vos script ? - Sephi-Chan - 08-06-2010

Fermer le site, c'est le must.

Plus sérieusement, je ne sais pas quoi te répondre.

Une solution simple et d'avoir un système de fragment caching efficace. Par exemple, si tu as une liste (avec pagination, sinon c'est trop simple) des joueurs de ton jeu. L'affichage ne devrait pas provoquer de requête SQL (sauf pour la première consultation qui suit la création d'un compte, qui aura éliminé une partie des caches présents) : le code HTML généré devrait être stocké quelque part (fichier, memcached, etc.) et lu.

Et c'est là que j'aimerai bien voir du code de toi ou d'Argorate. Comment vous faîtes ça ?


Sephi-Chan


RE: Avez-vous déjà testé la mémoire que prenait PHP avec vos script ? - php_addict - 08-06-2010

(08-06-2010, 11:20 PM)Sephi-Chan a écrit : Et c'est là que j'aimerai bien voir du code de toi ou d'Argorate. Comment vous faîtes ça ?

effectivement les pages de mon projet sont générées à chaque fois (pour ce qui est des données du joueur, par exemple les batiments du joueur. donc si tu clique sur un batiment 10 fois de suite, alors il y aura interogation de la base de donnée à chaque fois.

par contre evidement une grosse partie du code HTML n'est pas générée puisque il fait partie d'un fichier VUE (mvc) et donc une bonne partie du HTML est simplement lu

je n'ai pas de système de mise en cache du HTML des pages générées mais pour mon projet je ne suis pas certain que cela ai un réel interet (par exemple si un joueur affiche l'un de ces propres batiment il va bien falloir tester qu'il existe encore donc interroger la base de donnée)

pour le moment je n'ai pas vu quelles sont les pages de mon site qui auraient besoin d'un systeme de cache (je n'ai pas encore attaqué la partie statistiques, classements, etc... du jeu par exemple)


RE: Avez-vous déjà testé la mémoire que prenait PHP avec vos script ? - Argorate - 09-06-2010

Perso, je n'ai pas de classement, et j'ai pas de page des membres (vu que le forum phpbb a cette fonction et qu'un joueur sur le jeu => un membre du forum) je compte pas perdre du temps a le coder... Donc je n'ai pas vraiment ce problème :p

Sinon php_addict : pour se qui est du temps d'execution (que j'affiche en permanance pendant mes dev) c'est assez marrant de voir qu'en optimisant le code et surtout les requetes SQL, on peu décaler la virgule du bon coté Smile

Après, une fois que tu as un code relativement bien optimisé et idem pour les requetes, a moins d'avoir un soucis de perf, je vois pas ce que tu as a faire de plus?


RE: Avez-vous déjà testé la mémoire que prenait PHP avec vos script ? - Sephi-Chan - 09-06-2010

Argorate, tu dois bien avoir des parties de HTML qui peuvent être mises en cache, ne soit pas de mauvaise foi (ça ne fera pas aller ton application plus vite)… Et les micro-optimisations ne limiteront pas le gâchis.

(08-06-2010, 11:59 PM)php_addict a écrit :
(08-06-2010, 11:20 PM)Sephi-Chan a écrit : Et c'est là que j'aimerai bien voir du code de toi ou d'Argorate. Comment vous faîtes ça ?

effectivement les pages de mon projet sont générées à chaque fois (pour ce qui est des données du joueur, par exemple les batiments du joueur. donc si tu clique sur un batiment 10 fois de suite, alors il y aura interogation de la base de donnée à chaque fois.

par contre evidement une grosse partie du code HTML n'est pas générée puisque il fait partie d'un fichier VUE (mvc) et donc une bonne partie du HTML est simplement lu

je n'ai pas de système de mise en cache du HTML des pages générées mais pour mon projet je ne suis pas certain que cela ai un réel interet (par exemple si un joueur affiche l'un de ces propres batiment il va bien falloir tester qu'il existe encore donc interroger la base de donnée)

pour le moment je n'ai pas vu quelles sont les pages de mon site qui auraient besoin d'un systeme de cache (je n'ai pas encore attaqué la partie statistiques, classements, etc... du jeu par exemple)

Et c'est là que tu dois te tromper. Exemple dans l'application Spherium (le code source est dans ma signature, ainsi que les chapitres 3 et 4 du pas à pas qui traitent de ce que je vais indiquer). J'ai une page de ce genre :

[Image: show-built-sphere.png]

La carte est simplement construite en HTML. On a une partie constante pour tous les joueurs qui consiste à afficher toutes les sphères vides, c'est la même chose pour tous les joueurs : le HTML généré est mis en cache (cf. page de source de la vue). Le fichier de cache contient ça :


<div id="map">
<div class="ring" data-ring-index="0" id="ring-0">
<a class="sphere sphere-0-0" data-ring-index="0" data-sphere-index="0" href="/game/buildings/rings/0/spheres/0" id="sphere-0-0"/>
</div>
<div class="ring" data-ring-index="1" id="ring-1">
<a class="sphere sphere-1-0" data-ring-index="1" data-sphere-index="0" href="/game/buildings/rings/1/spheres/0" id="sphere-1-0"/>
<a class="sphere sphere-1-1" data-ring-index="1" data-sphere-index="1" href="/game/buildings/rings/1/spheres/1" id="sphere-1-1"/>
<a class="sphere sphere-1-2" data-ring-index="1" data-sphere-index="2" href="/game/buildings/rings/1/spheres/2" id="sphere-1-2"/>
<a class="sphere sphere-1-3" data-ring-index="1" data-sphere-index="3" href="/game/buildings/rings/1/spheres/3" id="sphere-1-3"/>
<a class="sphere sphere-1-4" data-ring-index="1" data-sphere-index="4" href="/game/buildings/rings/1/spheres/4" id="sphere-1-4"/>
<a class="sphere sphere-1-5" data-ring-index="1" data-sphere-index="5" href="/game/buildings/rings/1/spheres/5" id="sphere-1-5"/>
<a class="sphere sphere-1-6" data-ring-index="1" data-sphere-index="6" href="/game/buildings/rings/1/spheres/6" id="sphere-1-6"/>
<a class="sphere sphere-1-7" data-ring-index="1" data-sphere-index="7" href="/game/buildings/rings/1/spheres/7" id="sphere-1-7"/>
</div>
<div class="ring" data-ring-index="2" id="ring-2">
<a class="sphere sphere-2-0" data-ring-index="2" data-sphere-index="0" href="/game/buildings/rings/2/spheres/0" id="sphere-2-0"/>
<a class="sphere sphere-2-1" data-ring-index="2" data-sphere-index="1" href="/game/buildings/rings/2/spheres/1" id="sphere-2-1"/>
<a class="sphere sphere-2-2" data-ring-index="2" data-sphere-index="2" href="/game/buildings/rings/2/spheres/2" id="sphere-2-2"/>
<a class="sphere sphere-2-3" data-ring-index="2" data-sphere-index="3" href="/game/buildings/rings/2/spheres/3" id="sphere-2-3"/>
<a class="sphere sphere-2-4" data-ring-index="2" data-sphere-index="4" href="/game/buildings/rings/2/spheres/4" id="sphere-2-4"/>
<a class="sphere sphere-2-5" data-ring-index="2" data-sphere-index="5" href="/game/buildings/rings/2/spheres/5" id="sphere-2-5"/>
<a class="sphere sphere-2-6" data-ring-index="2" data-sphere-index="6" href="/game/buildings/rings/2/spheres/6" id="sphere-2-6"/>
<a class="sphere sphere-2-7" data-ring-index="2" data-sphere-index="7" href="/game/buildings/rings/2/spheres/7" id="sphere-2-7"/>
<a class="sphere sphere-2-8" data-ring-index="2" data-sphere-index="8" href="/game/buildings/rings/2/spheres/8" id="sphere-2-8"/>
<a class="sphere sphere-2-9" data-ring-index="2" data-sphere-index="9" href="/game/buildings/rings/2/spheres/9" id="sphere-2-9"/>
<a class="sphere sphere-2-10" data-ring-index="2" data-sphere-index="10" href="/game/buildings/rings/2/spheres/10" id="sphere-2-10"/>
<a class="sphere sphere-2-11" data-ring-index="2" data-sphere-index="11" href="/game/buildings/rings/2/spheres/11" id="sphere-2-11"/>
</div>
<div class="ring" data-ring-index="3" id="ring-3">
<a class="sphere sphere-3-0" data-ring-index="3" data-sphere-index="0" href="/game/buildings/rings/3/spheres/0" id="sphere-3-0"/>
<a class="sphere sphere-3-1" data-ring-index="3" data-sphere-index="1" href="/game/buildings/rings/3/spheres/1" id="sphere-3-1"/>
<a class="sphere sphere-3-2" data-ring-index="3" data-sphere-index="2" href="/game/buildings/rings/3/spheres/2" id="sphere-3-2"/>
<a class="sphere sphere-3-3" data-ring-index="3" data-sphere-index="3" href="/game/buildings/rings/3/spheres/3" id="sphere-3-3"/>
<a class="sphere sphere-3-4" data-ring-index="3" data-sphere-index="4" href="/game/buildings/rings/3/spheres/4" id="sphere-3-4"/>
<a class="sphere sphere-3-5" data-ring-index="3" data-sphere-index="5" href="/game/buildings/rings/3/spheres/5" id="sphere-3-5"/>
<a class="sphere sphere-3-6" data-ring-index="3" data-sphere-index="6" href="/game/buildings/rings/3/spheres/6" id="sphere-3-6"/>
<a class="sphere sphere-3-7" data-ring-index="3" data-sphere-index="7" href="/game/buildings/rings/3/spheres/7" id="sphere-3-7"/>
<a class="sphere sphere-3-8" data-ring-index="3" data-sphere-index="8" href="/game/buildings/rings/3/spheres/8" id="sphere-3-8"/>
<a class="sphere sphere-3-9" data-ring-index="3" data-sphere-index="9" href="/game/buildings/rings/3/spheres/9" id="sphere-3-9"/>
<a class="sphere sphere-3-10" data-ring-index="3" data-sphere-index="10" href="/game/buildings/rings/3/spheres/10" id="sphere-3-10"/>
<a class="sphere sphere-3-11" data-ring-index="3" data-sphere-index="11" href="/game/buildings/rings/3/spheres/11" id="sphere-3-11"/>
<a class="sphere sphere-3-12" data-ring-index="3" data-sphere-index="12" href="/game/buildings/rings/3/spheres/12" id="sphere-3-12"/>
<a class="sphere sphere-3-13" data-ring-index="3" data-sphere-index="13" href="/game/buildings/rings/3/spheres/13" id="sphere-3-13"/>
<a class="sphere sphere-3-14" data-ring-index="3" data-sphere-index="14" href="/game/buildings/rings/3/spheres/14" id="sphere-3-14"/>
<a class="sphere sphere-3-15" data-ring-index="3" data-sphere-index="15" href="/game/buildings/rings/3/spheres/15" id="sphere-3-15"/>
</div>
</div>

Tu notera que ça fait un paquet de code, quand même, à générer sur chaque page en récupérant la carte, les anneaux de la carte puis les sphères des anneaux. Alors que finalement c'est constant. Et bien je le cache en faisant simplement :


<% cache "base_for_map_#{@map.id}" do %>
<%= map_base_tag(@map) %>
<% end %>


Ensuite, la deuxième couche affiche (sur la précédente) les bâtiments construits par le joueur (les sphères de couleur). Et là aussi, ces liste est constante pour chaque joueur, elle ne change que quand l'utilisateur crée un bâtiment. Ainsi, le cache de la liste des bâtiments de l'utilisateur #1 est :


<a class="building sphere sphere-3-1 energy_well" data-ring-index="3" data-sphere-index="1" href="/game/buildings/rings/3/spheres/1" id="building-1"/>
<a class="building sphere sphere-2-2 energy_well" data-ring-index="2" data-sphere-index="2" href="/game/buildings/rings/2/spheres/2" id="building-2"/>
<a class="building sphere sphere-3-13 energy_well" data-ring-index="3" data-sphere-index="13" href="/game/buildings/rings/3/spheres/13" id="building-3"/>
<a class="building sphere sphere-3-9 energy_well" data-ring-index="3" data-sphere-index="9" href="/game/buildings/rings/3/spheres/9" id="building-4"/>
<a class="building sphere sphere-2-0 barracks" data-ring-index="2" data-sphere-index="0" href="/game/buildings/rings/2/spheres/0" id="building-5"/>
<a class="building sphere sphere-1-2 barracks" data-ring-index="1" data-sphere-index="2" href="/game/buildings/rings/1/spheres/2" id="building-6"/>
<a class="building sphere sphere-3-11 house" data-ring-index="3" data-sphere-index="11" href="/game/buildings/rings/3/spheres/11" id="building-11"/>
<a class="building sphere sphere-3-4 energy_well" data-ring-index="3" data-sphere-index="4" href="/game/buildings/rings/3/spheres/4" id="building-14"/>
<a class="building sphere sphere-3-14 energy_well" data-ring-index="3" data-sphere-index="14" href="/game/buildings/rings/3/spheres/14" id="building-23"/>
<a class="building sphere sphere-3-2 barracks" data-ring-index="3" data-sphere-index="2" href="/game/buildings/rings/3/spheres/2" id="building-25"/>
<a class="building sphere sphere-3-7 energy_well" data-ring-index="3" data-sphere-index="7" href="/game/buildings/rings/3/spheres/7" id="building-26"/>
<a class="building sphere sphere-3-12 energy_well" data-ring-index="3" data-sphere-index="12" href="/game/buildings/rings/3/spheres/12" id="building-27"/>
<a class="building sphere sphere-3-3 energy_well" data-ring-index="3" data-sphere-index="3" href="/game/buildings/rings/3/spheres/3" id="building-28"/>


Donc je fais ça :


<% cache "buildings_map_of_user_#{current_user.id}" do %>
<% @buildings_for_map.each do |building| %>
<%= building_tag(building) %>
<% end %>
<% end %>

Grâce à ActiveRecord 3 (embarqué dans Rails 3), les requêtes sont réalisées au dernier moment, quand on cherche à itérer sur les bâtiments. Du coup si le cache existe, les requêtes ne sont même pas effectuées.

Et quand je recycle ou construit un bâtiment (ou quand il sera détruit dans un combat), j'ai simplement à appeler la méthode expire_fragments), comme le montre le code de mon contrôleur Buildings.

Et ce déclenchement des requêtes au plus tard, vous n'êtes pas prêts de le faire avec un système maison (déjà qu'aucun ORM pour PHP ne va aussi loin dans le lazy loading…), ni ce système de cache très simple d'utilisation.

Ça vaut le coup de consommer un peu plus de RAM et d'avoir une application plus intelligente, non ?


Sephi-Chan


RE: Avez-vous déjà testé la mémoire que prenait PHP avec vos script ? - php_addict - 09-06-2010

(09-06-2010, 07:44 AM)Sephi-Chan a écrit : Et ce déclenchement des requêtes au plus tard, vous n'êtes pas prêts de le faire avec un système maison (déjà qu'aucun ORM pour PHP ne va aussi loin dans le lazy loading…), ni ce système de cache très simple d'utilisation.

effectivement personnellement je ne suis pas prêt de mettre en place un tel système de cache...

(09-06-2010, 07:44 AM)Sephi-Chan a écrit : Ça vaut le coup de consommer un peu plus de RAM et d'avoir une application plus intelligente, non ?

là tu m'a convaincu, mon prochain projet sera certainement avec un framework

dernières petites questions:

- ton système de cache, utilise t il la RAM ou utilise t il un système de fichier?
- ton exemple de HTML mis en cache fais 7Ko donc si tu as 1000 joueurs qui ont affichés cette page dans un laps de temps assez court cela te fais 7Mo de cache, a moins que le cache ne soit compressé...cela risque d'etre enorme les données mise en cache non?
-quand est ce que le cache est detruit? à la fin de la session (beaucoup de joueur ne se deconnecte pas)? apres un certain delais?