IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Objets serveur persistant


Sujet :

Langage PHP

  1. #1
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 42
    Par défaut Objets serveur persistant
    Bonjour,
    j'aimerai savoir y a t'il une possibilité de persisté mes objets, je ne veux pas a chaque connexion entre client serveur(envoi requête HTTP) je recréer mes objets..
    je veux les créer qu'une seul fois puis je les persiste ensuite je récupère seulement ses références(comme en java)????

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    salut,

    tu peux utiliser APC, memcache, les semaphores.

    De préférence APC, c'est plus rapide, sémaphore je n'ai pas utilisé, memcache utilise une pile tcp, c'est centralisé (si tu as plusieurs fronteux) mais plus lent (moi je trouve que cela n'en vaut pas la peine, et puis tu as vite fait de péter le quota de connexions).

    Dans le détails techniques, tu sérialises, tu désérialises, ça marche impec, en prod depuis des mois sur ma dal ça soulage à mort.

    a plus

  3. #3
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 42
    Par défaut
    merci,
    mais y t'il plus des détails sur votre technique en utilisant serialize et unserialize???
    je n'arrive pas a comprendre clairement comment avec ces deux fct en peut persisté un objet??

  4. #4
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 42
    Par défaut
    y a t'il un exemple??

  5. #5
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 42
    Par défaut
    bon, c'est bon..
    voila mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class C
    {
    .......
    }
     
    if(unserialize(apc_fetch($_POST['password_client']))==''){
    	$objC = new C('toto');
    	apc_add('objC',  serialize($objC)); 
    }
     
    $objC  = unserialize(apc_fetch($_POST['password_client']));
    var_dump($objC );
    merci encore une fois.
    juste pour me assurer.. lorsque j'ai plusieurs instanciation de mon class C (une instanciation pour chaque client), il n' y pas ni conflit ni écrasement des objets sérialisé nn?

  6. #6
    Membre éclairé Avatar de kanzarih
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2002
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2002
    Messages : 327
    Par défaut
    Bonsoir,

    Regarde par ici


  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    juste pour me assurer.. lorsque j'ai plusieurs instanciation de mon class C (une instanciation pour chaque client), il n' y pas ni conflit ni écrasement des objets sérialisé nn?
    Je ne connais pas ton appli, mais pour ce qui me concerne je n'ai eu à gérer jamais plusieurs sources d'écritures simultanées pour une même donnée possible.
    En fait je met à jour le cache à chaque update de base, c'est un mécanisme intégré à ma dal, si je delete une source en base, je la supprime du cache, de même pour les insert / update ect.

    Je ne m'était pas posé cette question de l'éventualité d'avoir plusieurs sources d'écritures, éventuellement simultanés, pour un même objet, mais en y réfléchissant, je ne voit pas de solutions pour s'assurer de la cohérence des données dans un tel cas avec php.
    A moins de rentrer dans un système de prxoy/servlet, mais cela devient lourd...

    Ce que je te propose plus haut est clairement un système optimiste.
    A toi de juger de sa viabilité dans ton appli.

    Pour infos, je restreint mes caches à certains types de données, toute la données ne mérite pas le cache.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 31
    Par défaut
    Bonjour,

    Je sais pas si je dois recréer un sujet, mais j'ai quelques soucis avec APC. Pourquoi ce bout de code si simple ne fonctionne-t-il pas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    apc_add('test','1');
    echo apc_fetch('test');
    apc_delete('test');
    apc_add('test','2');
    echo apc_fetch('test');
    Il ne m'affiche que '1'.

    En faite, j'ai besoin de récupérer un tableau du cache (apc_fetch()) que j'aurais ajouté avant, le supprimer (apc_delete()), ajouter une valeur au tableau, et le sauver dans le cache (apc_add()).
    Mais lorsque je veux voir s'il a bien été sauvé (avec un apc_fetch()), ça me fait comme le code ci-dessus, ça m'affiche rien au lieu du nouveau tableau qui devrait être sauver.
    De plus la fonction apc_delete() retourne une erreur.

    Quelqu'un sait comment faire?

    Merci beaucoup de votre aide.

    (Désolé abir001 d'utiliser ton topic pour ma question).

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Salut,

    As tu regarder apc_replace ? De souvenir si apc_add, retourne false, alors il faut appeler apc_replace. C'était dans les commentaires de la doc.

    Autrement, peux tu nous montrer un vrai bout de code stp. Là ce n'est pas représentatif.

    Mais ceci dit, ton problème me semble étrange à moi aussi.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 31
    Par défaut
    Citation Envoyé par kaymak Voir le message
    Salut,

    As tu regarder apc_replace ? De souvenir si apc_add, retourne false, alors il faut appeler apc_replace. C'était dans les commentaires de la doc.

    Autrement, peux tu nous montrer un vrai bout de code stp. Là ce n'est pas représentatif.

    Mais ceci dit, ton problème me semble étrange à moi aussi.
    Désolé mais aucune fonction "apc_replace" n'existe à ma connaissance.
    APC est utilisé pour mettre en cache des pages par exemple. Pour ma part, j'aimerais l'utiliser pour utiliser une variable global dans le sens où elle est accessible par tous les utilisateurs.
    Mon but est, dans une fonction PHP, de tester si une variable de type array() existe dans le cache. Si elle existe, on la récupère dans une variable PHP, on la supprimer du cache, on ajoute un élément à la variable récupérée et on la sauve a nouveau dans le cache. En code, cela donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    function addElement($element)
    {
        if (apc_exists('test'))
        {
             $var = apc_fetch('test');
             apc_delete('test');
             $var[] = $element;
             apc_add('test',$var);
         }
         else
         {
              apc_add('test',array($element));
          }
    }

    Malheureusement cela ne fonctionne pas. La fonction apc_delete() retourne false et apc_add() juste après aussi. Pour l'instant, j'ai trouvé mon bonheur avec XCache qui fonctionne nickel. Mais j'aimerais savoir pourquoi APC ne fonctionne pas, une idée?

    Merci d'avance.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Voui enfin rien de ne t'empêche de te documenter :/

    http://fr2.php.net/manual/fr/function.apc-store.php

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 31
    Par défaut
    Citation Envoyé par kaymak Voir le message
    Voui enfin rien de ne t'empêche de te documenter :/

    http://fr2.php.net/manual/fr/function.apc-store.php
    J'ai tout essayé, avec des apc_store (et non ça n'écrase pas la valeur), avec des apc_delete_file (ça n'efface rien).

    Je reformule un peu ma demande:
    Mon but: stocker une valeur en cache, la changer, la récupérer.
    Mon problème: Je n'arrive pas à la changer !

    Ce code illustre mon problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    apc_add('test','1');
    echo apc_fetch('test'); //Devrait afficher 1 et ça affiche bien 1
    apc_delete('test');
    apc_add('test','2');
    echo apc_fetch('test'); // Devrait afficher 2, mais n'affiche rien
    Au niveau des valeurs de renvoie, le apc_delete renvoie false et l'apc_add renvoie false aussi.

    J'ai essayé avec d'autres fonctions (apc_store/apc_delete_file) mais rien n'y fait.
    Si quelqu'un utilisant APC pouvait tester mon code et me dire si le même problème se produit? Voire même me donner une solution?

    Merci beaucoup !

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    hello,

    je viens de le tester sur un de mes serveurs. Et ton fichier fonctionne.

    Comme prévu, au premier passage il affiche 12.
    Au second passage il affiche 22.

    Lors du second appel à apc_add('test','1');, celui ci échoue car test existe déjà.

    quel est ta version de php / apc / OS ?
    Sinon, as tu bien désactive les autres optimiseurs et autres débuggeurs de ta config php ?
    Sinon, oui tu as bien un problème bizarre.

    Par ailleurs, avec apc_store, la valeur est bien écrasé à chaque appel, même sans appel a apc_delete.


    a plus

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 31
    Par défaut
    Pour ma part, j'ai résolu le problème avec xcache.

    Mes testes étaient sur Windows XP avec WampServer avec PHP 5.3.0 et une version d'apc trouvé ici

    Est-ce tu aurais par hasard la config de apc que tu fais dans ton php.ini? Histoire que je vérifie si c'est pas ça...

    Sinon qu'entends-tu par "optimiseur" et "débuggeur"? Les extensions activées sont les suivantes:
    - php_gd2
    - php_mbstring
    - php_mysql
    - php_mysqli
    - php_pdo_mysql

  15. #15
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 42
    Par défaut
    il y a une autre solution pour persister le objet: l'ORM (object-relational mapping) comme hibernate en java on trouve doctrine en php... je veux savoir quel est la meilleur solution pour résoudre le problème de persistance des objets pour les application web soit APC soit ORM???

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Citation Envoyé par gagou7 Voir le message
    Pour ma part, j'ai résolu le problème avec xcache.

    Mes testes étaient sur Windows XP avec WampServer avec PHP 5.3.0 et une version d'apc trouvé ici

    Est-ce tu aurais par hasard la config de apc que tu fais dans ton php.ini? Histoire que je vérifie si c'est pas ça...

    Sinon qu'entends-tu par "optimiseur" et "débuggeur"? Les extensions activées sont les suivantes:
    - php_gd2
    - php_mbstring
    - php_mysql
    - php_mysqli
    - php_pdo_mysql
    hello,

    optimiseur => apc, xcache
    débuggeur => xdebug, et zend_quelque_chose

    Donc non, ce n'est pas ton cas. Mais en lisant ton post, je pense que ce sont les librairies que tu as utilisées qui n'étaient simplement par correctement compilées pour fonctionner ensemble.
    Bref, c'est ici un problème de compilation.
    Il faudrait soir de nouvelle release pour windows, soit compiler toi même (opération relativement difficile sur windows il me semble).

    Sinon moi j'ai mis cela comme config
    Code ini : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [Apc]
    extension=apc.so
    apc.enabled=1
    apc.shm_segments=1
    apc.shm_size=128
    apc.ttl=7200
    apc.user_ttl=7200
    apc.num_files_hint=1024
    apc.mmap_file_mask=/tmp/apc.XXXXXX
    apc.enable_cli=1
    apc.include_once_override=1
    apc.max_file_size=3M
    apc.filters="pages/.*/(vue|init)\.php"

    il y a une autre solution pour persister le objet: l'ORM (object-relational mapping) comme hibernate en java on trouve doctrine en php... je veux savoir quel est la meilleur solution pour résoudre le problème de persistance des objets pour les application web soit APC soit ORM??
    ?
    Ce sont deux choses différentes.
    Un ORM est utilisé pour effectuer du stockage en bases de données.
    Alors oui tu manipules des objets php, mais tu sockes des lignes et des colonnes !
    Par ailleurs, ces deux outils sont plutôt à utiliser ensemble pour des performances optimum et un coût de dév réduit.

    Mais je ne sais pas si doctrine, ou autre, intègre ce type de cache....

    a plus

Discussions similaires

  1. [2.x] objet non persistant malgre le codage
    Par Philcmoi dans le forum Symfony
    Réponses: 7
    Dernier message: 07/04/2014, 12h07
  2. Objet application / persistant
    Par dehbi dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/02/2009, 22h52
  3. Réponses: 2
    Dernier message: 25/11/2008, 13h28
  4. Réponses: 2
    Dernier message: 02/04/2008, 18h26
  5. [Struts][DynaActionForm et persistance des objets]
    Par jcos dans le forum Struts 1
    Réponses: 4
    Dernier message: 22/12/2004, 09h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo