TourDeJeu, le réseau des jeux en ligne alternatifs : jeux web multijoueurs, jeux par forum. En savoir +

Flux RSS des discussions du forum : pour les joueurs, et pour les créateurs et MJ
  Reply to this topicStart new topicStart Poll

> Serialize <- Sessions -> Unserialize, Simple question
Draedrus
Ecrit le : Vendredi 05 Octobre 2007 à 20h59
Quote Post


Ouf
*

Groupe : Membre
Messages : 212


Bonjour, je pensais passer tout mon jeu en POO. Mais bon, ça me rajoute des requêtes bla et bla et ça ne m'a pas paru si avantageux que ça ( maniaque... ).

Mais je me suis rappelé de la serialisation d'un objet instancié et de la création d'un autre objet avec les mêmes valeurs que l'objet précédent via serialize() et unserialize(). Est-ce une méthode intéréssante pour moi ou il vaut mieux faire plein de requêttes sql ?... :/


--------------------
user posted image

- Un jeu de rôles avec... Un peu d'Humour, un peu de médieval-fantastique, un peu de stratégie, un peu de délire profond, un peu de désign bon enfant... :)
PMEmail PosterUsers Website
Top
Hautelune
Ecrit le : Vendredi 05 Octobre 2007 à 23h22
Quote Post


Kid
*

Groupe : Membre
Messages : 31


Ça dépend vraiment beaucoup de ton projet et de la façon dont il va évoluer. Si tout est figé et que tu ne cherches que l'amélioration des perfs alors va pour le serialize. Mais si tu vises à plus long terme, perdre l'aspect relationnel de ta BDD avec des serialize à gogo c'est dommage, même si c'est moins gourmand en requêtes.

M'enfin je dis ça et j'avais commencé en abusant du serialize dans mon projet, maintenant je regrette et j'en bave un peu pour tout remanier, mais je trouve qu'au final c'est plus élégant.


--------------------
user posted image
PMEmail Poster
Top
butch2k
Ecrit le : Samedi 06 Octobre 2007 à 13h37
Quote Post


Kid
*

Groupe : Membre
Messages : 20


Quel est exactement le besoin ?
Tu as besoin de faire une copie de l'instance ou de partager la même instance ?
PMEmail Poster
Top
Draedrus
Ecrit le : Vendredi 19 Octobre 2007 à 23h15
Quote Post


Ouf
*

Groupe : Membre
Messages : 212


Oui smile.gif je cherche à copier une instance initialisée au login du joueur contenant les informations importantes du joueur et les utiliser ainsi sur toutes mes pages visitées en évitant un maximum les requêtes ^^'. Comme le dis HauteLune effectivement on peut en "ch***" pour mettre en place ou défaire ce genre de systémes ^^', d'ailleurs je n'ai toujours pas fini, mais bon, à priori j'ai décidé de mettre à jour les données membres de ma classe et les re-serialiser à la fin de chaque page modifiant ces données membres, ainsi je n'ai pas trop de soucis smile.gif.


--------------------
user posted image

- Un jeu de rôles avec... Un peu d'Humour, un peu de médieval-fantastique, un peu de stratégie, un peu de délire profond, un peu de désign bon enfant... :)
PMEmail PosterUsers Website
Top
butch2k
Ecrit le : Samedi 20 Octobre 2007 à 11h49
Quote Post


Kid
*

Groupe : Membre
Messages : 20


Dans un cas pareil j'utilise un système de cache genre XCache ou Eaccelerator, dans lequel je stocke mes variables sérialisées, ne les enregistrant en BD que si il y a modif.
PMEmail Poster
Top
Hautelune
Ecrit le : Samedi 20 Octobre 2007 à 23h57
Quote Post


Kid
*

Groupe : Membre
Messages : 31


Pourquoi ne pas utiliser les variables de sessions PHP pour conserver des données de page en page, en ne les enregistrant en BDD que s'il y a modif effectivement ?


--------------------
user posted image
PMEmail Poster
Top
Draedrus
Ecrit le : Dimanche 21 Octobre 2007 à 14h18
Quote Post


Ouf
*

Groupe : Membre
Messages : 212


Arf j'ai du mal m'expliquer ! Pardonnez moi !
Enfaite j'utilise éxactement vos idées c'est ce qui était prévu et je fais mes test comme ça dans les pages:

CODE
if($sess->get_save()) { $p1=unserialize($sess->get_save()); }else{ $p1=new userObj($sess->id); }


et à la fin de mes pages et avant toute redirection:
CODE
$sess->set_save($p1->save()); // serialise l'instance


Voilà smile.gif enfaite ça me semblait une trés bonne idée, et ça continue de me plaire cette idée biggrin.gif
( et quand j'y pense que je l'ai eue dans un rêve v__v' ).


--------------------
user posted image

- Un jeu de rôles avec... Un peu d'Humour, un peu de médieval-fantastique, un peu de stratégie, un peu de délire profond, un peu de désign bon enfant... :)
PMEmail PosterUsers Website
Top
the-gtm
Ecrit le : Lundi 22 Octobre 2007 à 19h55
Quote Post


Pro
*

Groupe : Membre
Messages : 130


Il faut juste faire gaffe à ne pas introduire de bug/faille avec ce système.

Par exemple si le nombre de pièces d'or est stocké dans la session et qu'un joueur ouvre deux sessions, il peut acheter un objet dans une session, puis un deuxième objet dans l'autre session. Dans ce cas, la 2e session n'a pas "vu" que le nombre de pièces a baissé, lorsque la BDD est mise à jour, la valeur enregistrée sera nombre initial - prix 2e achat.
PMEmail Poster
Top
Draedrus
Ecrit le : Jeudi 25 Octobre 2007 à 16h32
Quote Post


Ouf
*

Groupe : Membre
Messages : 212


Effectivement c'est embêtant :/, j'avais aussi pensé à ce cas précis:
Joueur1 tue joueur2
joueur2 était en train de tapper un pnj mais il n'est pas mort.
La bdd considére que le joueur2 est mort tandis que la session joueur2 pense qu'il est toujours vivant. Je n'ai pas encore trouvé de solution magique, pour les pièces d'or je pensais faire que la bdd gère tout à partir de ses connaissances, exemple:
Joueur1 achète un objet qui coûte 180 Pièces d'Or, la bdd va simplement retirer 180 de la base de données et 180 des données de session du joueur ^^'. Je me dis que du coûp ça parait un peu inutile de porter mon jeu en P.O.O v__v'... Enfin je trouverais bien quelque chose smile.gif. Stockage sur fichier texte peut-être ? ça évite des requêttes sql mais est-ce plus pratique ? ...
Enfin tout pour dire, ça peut être sympa mais effectivement comme il a été dit plus haut... DurDur biggrin.gif


--------------------
user posted image

- Un jeu de rôles avec... Un peu d'Humour, un peu de médieval-fantastique, un peu de stratégie, un peu de délire profond, un peu de désign bon enfant... :)
PMEmail PosterUsers Website
Top
Hautelune
Ecrit le : Jeudi 25 Octobre 2007 à 17h06
Quote Post


Kid
*

Groupe : Membre
Messages : 31


Les sessions permettent de se dispenser d'appels permanents à la BDD mais la contrepartie est que lorsqu'on effectue des opérations qui interagissent avec l'environnement de jeu (achat d'objet, combat...) on DOIT faire les tests sur des données "fraîches" et pas se contenter de celles contenues dans la session, sinon effectivement on va avoir des surprises:)

Dans nos deux exemples lors de l'achat, même si la session indique une fortune suffisante, il doit au dernier moment avoir un test sur la quantité d'or réelle avant la transaction.
Idem pour le combat, lors d'un coup on doit faire les calculs de toucher, mais en même temps ajouter une clause du type "and assaillant is alive".

Y'a pas moyen d'y déroger.


--------------------
user posted image
PMEmail Poster
Top
butch2k
Ecrit le : Jeudi 25 Octobre 2007 à 18h22
Quote Post


Kid
*

Groupe : Membre
Messages : 20


D'où l'interet d'utiliser des variable stockée dans un cache coté serveur, ça permet de partager une instance entre les sessions.
PMEmail Poster
Top
Draedrus
Ecrit le : Vendredi 26 Octobre 2007 à 19h43
Quote Post


Ouf
*

Groupe : Membre
Messages : 212


Je ne connais pas de méthodes pour enregistrer des variables en cache côté serveur comme tu me dis là =o.
Je pensais sinon à un systéme de temps géré avec le constructeur etc, un systéme qui vérifie une date avec time() et si le temps prévu est dépassé on recharge les données avec la bdd, une sorte de systémes de PA en somme avec les données du joueur biggrin.gif, en même temps je sors à peine de mes partiels le temps que ma cervelle fume moins...


--------------------
user posted image

- Un jeu de rôles avec... Un peu d'Humour, un peu de médieval-fantastique, un peu de stratégie, un peu de délire profond, un peu de désign bon enfant... :)
PMEmail PosterUsers Website
Top
butch2k
Ecrit le : Vendredi 26 Octobre 2007 à 22h02
Quote Post


Kid
*

Groupe : Membre
Messages : 20


Tu installe xcahce ou eaccelerator et tu regardes les API:
http://xcache.lighttpd.net/wiki/XcacheApi
http://bart.eaccelerator.net/doc/phpdoc/

C'est facile à utiliser, et franchement ça simplifie la vie. En pratique c'est géré par des segments de mémoire partagés, accessible donc par les divers threads apaches. Je l'utilise comme cache pour mes objets persos, groupe etc... ça m'évite de tout recalculer chaque fois qu'un utilisateur affiche la page.
PMEmail Poster
Top
Draedrus
Ecrit le : Lundi 29 Octobre 2007 à 11h50
Quote Post


Ouf
*

Groupe : Membre
Messages : 212


Ah bah ça peut être sympa, pour le moment je vais choisir la facilité je manque cruellement de temps et par la suite je vais regarder ça smile.gif. PS: 8 requêtes par page çe ne fait pas un peu trop ? :/

[edit] Bon ce genre de solutions sont incompatibles avec mon cas, je ne suis pas propriétaire du serveur :}, je ne peux pas modifier php.ini ni ajouter de modules. Donc je vais trouver une astuce pour gèrer mon probléme.


--------------------
user posted image

- Un jeu de rôles avec... Un peu d'Humour, un peu de médieval-fantastique, un peu de stratégie, un peu de délire profond, un peu de désign bon enfant... :)
PMEmail PosterUsers Website
Top
askywhale
Ecrit le : Dimanche 04 Novembre 2007 à 21h19
Quote Post


Pro
*

Groupe : Membre
Messages : 170


QUOTE
Joueur1 achète un objet qui coûte 180 Pièces d'Or, la bdd va simplement retirer 180 de la base de données et 180 des données de session du joueur ^^'. Je me dis que du coûp ça parait un peu inutile de porter mon jeu en P.O.O v__v'... Enfin je trouverais bien quelque chose smile.gif. Stockage sur fichier texte peut-être ? ça évite des requêttes sql mais est-ce plus pratique ? ...


Là en effet ça part pas bien si tu te pose ces questions wink.gif

Si en effet tu as une redondance de données entre ta session et ta bdd, tu va pas t'en sortir je pense (sauf si par exemple tu stocke en session que des données issues de la base, et jamais l'inverse, i.e. ta session te sert de cache d'affichage, avec eventuellement des objets dedans).

Par contre BDD rel + POO ça se fait bien (i.e. stockage des objets dans la base). Y'a des frameworks pour faire ça (tu voudra sans doute faire le tien propre en regardant comment sont fait ruby/rails, hibernate, ... qui font référence dans d'autres langages).


--------------------
PMEmail Poster
Top
Draedrus
Ecrit le : Lundi 19 Novembre 2007 à 21h26
Quote Post


Ouf
*

Groupe : Membre
Messages : 212


Merci j'y jetterais un coup d'oeuil en temps voulu wink.gif.


--------------------
user posted image

- Un jeu de rôles avec... Un peu d'Humour, un peu de médieval-fantastique, un peu de stratégie, un peu de délire profond, un peu de désign bon enfant... :)
PMEmail PosterUsers Website
Top
Sybler
Ecrit le : Jeudi 29 Novembre 2007 à 00h17
Quote Post


Ouf
*

Groupe : Membre
Messages : 453


Et outre le fait que ça puisse rajouter quelques requête, n'oublie pas que l'orienté objet peut te permettre d'utiliser moins de code.

Mais c'est -particulièrement en PHP- qu'un projet fait à 100% en objet sera inefficace, puisqu'il rechargera des informations souvent inutiles et inchangés entre chaque page. Il faut savoir utilise intelligemment le concept.


Rien ne t'empêche d'avoir un projet hybride, un peu comme les projets dont certaines parties aux performances critiques sont fait en ASM plutot qu'en C comme le reste.


--------------------
user posted image
PMEmail PosterUsers Website
Top
selenia
Ecrit le : Dimanche 20 Janvier 2008 à 17h43
Quote Post


Pro
*

Groupe : Membre
Messages : 163


Je suis du même avis que Sybler.

Certaines parties d'un jeu mérites d'être en objet pour l'avantage que l'on tire de la structure de ce paradigme. Mais le PHP étant de base un langage de script impératif sait aussi très bien fonctionner avec ces dits scripts et il ne faut pas s'en passer.

Par exemple les armes, personnages, lieux et autres choses plutôt facilement modélisables et nombreuses sont surement à faire en objet pour rendre tout d'une certaines souplesse. L'objet permet de belles choses et il ne faut pas s'en priver quand ca peut être utile. (contraintes de Typage, héritage, interface, abastraction ...)
PMEmail Poster
Top
Draedrus
Ecrit le : Mercredi 27 Février 2008 à 17h54
Quote Post


Ouf
*

Groupe : Membre
Messages : 212


Oui en commençant à rèfléchir au projet et à coder je m'en suis vite rendu compte, ça devenait plutôt lourd, incohérent. J'ai récemment décidé de détruire certaines classes et en garder que quelques unes. J'ai aussi commencé à jeter un oeuil à AJAX pour voir si ça pouvait être sympatique, l'idée me semble plutôt bonne, plutot que de charger 36 pages pour effectuer quelques actions plutôt faire 4 requêtes HTTP ( en mode GET ) bien pensées et afficher le résultat sur la page déjà chargée... Les requêtes font entre 300ms et 350ms, celà vous semble beaucoup ? Est-ce réellement intéressant ? Je sais qu'en abuser serait une très très grosse bétise... Mais utilisé juste pour les actions des joueurs ?


--------------------
user posted image

- Un jeu de rôles avec... Un peu d'Humour, un peu de médieval-fantastique, un peu de stratégie, un peu de délire profond, un peu de désign bon enfant... :)
PMEmail PosterUsers Website
Top
askywhale
Ecrit le : Jeudi 13 Mars 2008 à 15h43
Quote Post


Pro
*

Groupe : Membre
Messages : 170


QUOTE
es requêtes font entre 300ms et 350ms, celà vous semble beaucoup ?

Entre quoi et quoi ? Ca inclu l'envoi ou seulement le temps de travail du serveur ?

AJAX peut effectivement surcharger un serveur de requete.


--------------------
PMEmail Poster
Top
Guile
Ecrit le : Mardi 25 Mars 2008 à 01h42
Quote Post


Pro
*

Groupe : Membre
Messages : 66


Au fait, depuis PHP5, la POO est devenue super intéressante. Et pour la gestion de la session vous avez une simplicité de codage assez intéressante :
__destruct est une méthode qui est lancée automatiquement à la fin d'un script si vous avez déclaré une variable global qui contient la principale information (comme le compte user).
Mettez dans cette méthode __destruct de quoi enregistrer l'instance en session, et vous n'avez plus qu'à gérer l'unserialize dans la vérification de votre session.
Autre conseil : ne pas utiliser les cookies pour garder votre serialized, un joueur techniquement au point vous cassera votre petit site comme il faut.

Si vous enregistrer le serialized dans la BdD, pour moi, ça n'a d'utilité que si vous gérez également les sessions dans la BdD... chose qui peut se faire si vous faites un log des connexions (recherche de multicomptes)... Et dans ce cas, ça ne fait que déporter la gestion des sessions :-D

Et pour abonder dans le sens des Pro-POO : je n'étais vraiment pas persuadé de son intérêt il y a quelques années... j'y ai mis les pieds dedans par pure curiosité, et aujourd'hui je me vois mal continuer sans.
Un déboggage est rapidement fait, une évolution du site est faite aussi très rapidement, et pour ce qui est de l'argument "Trop de requêtes", je l'ai eu en tête dès le départ, et je ne trouve pas que cela soit un problème si les objets les plus importants sont correctement fait (càd prenant en compte le fait que les requêtes c'est long).
Pour mon jeu, j'ai utilisé différentes techniques objets qui, à mon avis, optimisent au mieux les requêtes sur le serveurs, la mémoire utilisée, leur maintenabilité, leur évolutivité, etc.
Les pages demandant un nombre important de requêtes sont rares, et uniquement utilisées par les administrateurs.
Les pages des joueurs utilisent très peu de requêtes.

La POO en PHP c'est comme tout : un problème de conception au départ, et c'est la mort du programme.

Pour ce qui est d'AJAX (ou ActionScript), faire attention aux fameux "hits" qui sont une façon de mesurer la charge d'un serveur. L'AJAX explose les hits, et beaucoup de hits, ça fait ramer un serveur : vaut mieux une grosse page, que 1000 petites pages.


--------------------
AvP Evolution : jeu de rôle au gameplay simple et à l'ambiance surchauffée!
Terres d'Alliances : la Campagne On-Line. Un jeu de stratégie médiéval... Mais qui n'a jamais été démarré
user posted image
PMEmail Poster
Top
« Sujets + anciens | Programmer | Sujets + récents »

Reply to this topicStart new topicStart Poll