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

Symfony PHP Discussion :

L'observateur d'événements bégaie + pb de mémoire


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut L'observateur d'événements bégaie + pb de mémoire
    Bonjour à tous,

    Dans le ProjectConfiguration.setup() de l'appli, j'ai déclaré des observateurs avec le code habituel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$eventDispatcher->connect('view.ads', array('StatsHandler', 'logAdsView'));
    Je teste l'un des fichiers lançant cet évenement. La notification est envoyée dans un bout de code compris dans une boucle. J'ai des traces de log juste derrière. Le bout de code (sans la boucle) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		sfContext::getInstance()->getEventDispatcher()->notify(new sfEvent(get_class($this), 'view.ads',
    				array(
    				    'subject' => $ads,
    				    'context' => StatsHandler::CONTEXT_MAIL,
    				    'source' => __METHOD__ . ' ligne ' . __LINE__,
    			))
    		);
    		nvLogger::err(memory_get_usage(true), __FILE__, __LINE__, __METHOD__);
    La réception de la notification dans mon observateur est pistée elle aussi dans les logs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public static function logAdsView(sfEvent $event) {
    	$context = $event['context'];
    	if ($context == self::CONTEXT_MAIL) {
    	    nvLogger::err("sfevent " . $event['source'], __FILE__, __LINE__, __METHOD__);
    	} else {
    	    nvLogger::debug("sfevent", __FILE__, __LINE__, __METHOD__);
    	}
        }
    Pb 1 : Je m'attends donc à avoir dans mes logs une trace de l'appel à logAdsView() et une trace du memory_get_usage par tour de boucle. Or, j'ai DEUX traces de l'appel à logAdsView() :
    aoû 22 08:36:30 symfony [err] /home/ohmimmob/apps/frontend/lib/StatsHandler.class.php - 36 - StatsHandler::logAdsView ->
    sfevent ohmSendEmailAlertTask::execute ligne 184
    aoû 22 08:36:30 symfony [err] /home/ohmimmob/apps/frontend/lib/StatsHandler.class.php - 36 - StatsHandler::logAdsView ->
    sfevent ohmSendEmailAlertTask::execute ligne 184
    aoû 22 08:36:30 symfony [err] /home/ohmimmob/lib/task/ohmSendEmailAlertTask.class.php - 187 - ohmSendEmailAlertTask::execute ->
    284164096
    aoû 22 08:36:33 symfony [err] /home/ohmimmob/apps/frontend/lib/StatsHandler.class.php - 36 - StatsHandler::logAdsView ->
    sfevent ohmSendEmailAlertTask::execute ligne 184
    aoû 22 08:36:33 symfony [err] /home/ohmimmob/apps/frontend/lib/StatsHandler.class.php - 36 - StatsHandler::logAdsView ->
    sfevent ohmSendEmailAlertTask::execute ligne 184
    aoû 22 08:36:33 symfony [err] /home/ohmimmob/lib/task/ohmSendEmailAlertTask.class.php - 187 - ohmSendEmailAlertTask::execute ->
    300679168
    Pb 2 : comme vous le voyez aux traces du memory_get_usage(), la mémoire allouée s'accumule et finit par provoquer une erreur d'allocation. Pourtant, j'ai paramétré la connexion Doctrine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$connection->setAttribute(Doctrine_Core::ATTR_AUTO_FREE_QUERY_OBJECTS, true);
    et je libère mes objets un peu encombrants à chaque tour de boucle à coups de unset().

    Si vous avez des idées sur l'un ou l'autre point, je suis preneur

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Pb2 -> question annulée, ce n'est pas un problème symfony. Après enquête, c'est un bug connu de PHP dont la fonction preg_replace() provoque des fuites de mémoire.

    Reste le bégaiement de l'eventDispatcher...

  3. #3
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Ha non, ce n'est pas juste le preg_replace : il y aussi des grosses fuites de mémoire dans Doctrine, qui font planter dès que je charge quelques centaines d'enregistrements en mémoire. Même avec un HYDRATE_ON_DEMAND, des appels à free() etc...

    Si quelqu'un a des idées pour me débloquer, je suis preneur parce que là, s'il faut que je ré-écrive tout le module pour faire les traitements en sortant de Doctrine, c'est la cata...

  4. #4
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Je continue à parler tout seul, mais au moins ça m'occupe

    Quelques tests plus loin sur ces problèmes de fuites de mémoire dans Doctrine, je m'aperçois que le HYDRATE_ON_DEMAND n'a guère d'effet quand on charge des collections d'objets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	    nvLogger::debug("Mémoire : " . memory_get_usage(true), __FILE__, __LINE__, __METHOD__);
    	    foreach (EmailAlertTable::getInstance()->findAll(Doctrine_Core::HYDRATE_ON_DEMAND) as $alert) {
    	    }
    	    nvLogger::debug("Mémoire : " . memory_get_usage(true), __FILE__, __LINE__, __METHOD__);
    Résultat :
    Aug 24 10:20:53 symfony [debug] C:\wamp\www\xxx\Sources\lib\model\doctrine\RealEstateAd.class.php - 145 - RealEstateAd::postInsert ->
    Mémoire : 36962304
    Aug 24 10:20:53 symfony [debug] C:\wamp\www\xxx\Sources\lib\model\doctrine\RealEstateAd.class.php - 150 - RealEstateAd::postInsert ->
    Mémoire : 38797312
    Sans le HYDRATE_ON_DEMAND : pareil.

    Me v'la bien...

Discussions similaires

  1. [W2000S] Observateur d'événements vide
    Par dily0403 dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 26/09/2007, 14h55
  2. XP-SP2 observateur d'évènements
    Par dadabe dans le forum Windows XP
    Réponses: 1
    Dernier message: 22/10/2006, 04h55
  3. Observateur d'évènements Windows
    Par Cdx dans le forum Delphi
    Réponses: 6
    Dernier message: 27/06/2006, 21h40
  4. erreur MRxSmb dans l'observateur d'évènement
    Par Mut dans le forum Windows Serveur
    Réponses: 10
    Dernier message: 19/05/2006, 17h10
  5. Observateurs d'évènements
    Par wareq dans le forum Windows XP
    Réponses: 3
    Dernier message: 10/05/2005, 16h30

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