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

Doctrine2 PHP Discussion :

Impossible de persist + flush plus de 1000 lignes


Sujet :

Doctrine2 PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Impossible de persist + flush plus de 1000 lignes
    Bonjour,

    J'ai un souci sur une table dans ma bdd, ou plutôt lorsque je persist et que je flush :
    ma table ne va pas plus loin que 1001 lignes (le champ ID) lorsque j'utilise doctrine pour en modifier les données, alors que via phpmyadmin, je peux ajouter d'autres entrées et largement dépasser les 1000 lignes.. Je suppose donc que cela ne vient pas de ma config mysql (mon champ ID est un int(15) unsigned, donc capable de dépasser les 1000 lignes), mais bien de doctrine ou symfony qui limite la taille du json, je ne sais pas.. Lorsque j'ajoute d'autres lignes à la main via phpmyadmin, les modifs s'affichent bien sur mon application : l'application semble capable de récupérer plus de 1000 lignes et de les afficher, mais pas d'envoyer une telle unité à la bdd (dès que j'enregistre, les lignes supplémentaires disparaissent).

    Voici le code lorsque je persist et flush :
    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
    17
    18
    19
    20
    21
    22
    public function clearData()
    	{
    		$connection = $this->_em->getConnection();
    		$platform   = $connection->getDatabasePlatform();
     
    		$connection->executeUpdate($platform->getTruncateTableSQL('laisonLink', false));
    	}
     
    	public function addLinks($data)
    	{
    		foreach($data as $link) {
    			// Création du lien
    			$lien = new LaisonLink();	// On crée le lien
    			$lien->setLinkParent($link['parent']);
    			$lien->setLinkEnfant($link['enfant']);
    			$lien->setTime(new \DateTime());
     
    			$this->_em->persist($lien);				// On le persiste
     
    		}
    	$this->_em->flush();	
    	}
    Et voici le code de mon controller pour cette action :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     public function linkLinksAction() 
        {	// Page permettant de relier les liens entre eux
     
        	$request = $this->get('request');
        	$formsRepository = $this->getDoctrine()->getEntityManager()->getRepository('appGlobalBundle:Link');
        	$linksRepository = $this->getDoctrine()->getEntityManager()->getRepository('appGlobalBundle:LaisonLink');
     
        	$links = $formsRepository->getVisible();
        	$linksBis = $linkssRepository->getVisible();
        	$existantes = $linksRepository->getData();
     
        	if( $request->getMethod() == 'POST' ) {
        		// On a reçu les nouvelles informations de liaison des liens, on les enregistre dans la base
     
        		$toRemove = array();
        		$toAdd = array();
     
        		$linksRepository->clearData();
     
        		foreach($links as $parent) {
        			foreach($linksBis as $enfant) {
     
    					if ($request->request->get('lien'.$parent->getId().'_'.$enfant->getId()) == 'on') {
        					// On ajoute un enregistrement
        					$toAdd[] = array('parent' => $parent, 'enfant' => $enfant);
        				}
        			}
        		}
     
        		$linksRepository->addLinks($toAdd);
     
        		return new Response(json_encode(array('text' => 'Les liaisons ont bien été mises à jour.', 'layout' => 'bottomLeft', 'type' => 'success')));
        	} else {
        		// On affiche le tableau de liaison, prérempli avec les informations existantes
        		return $this->render('appliGlobalBundle:Admin:linksLinks.html.twig', array('forms' => $links, 'lnBis' => $linksBis, 'liens' => $existantes));
        	}
     
     
        }
    Merci pour votre aide

  2. #2
    Membre averti

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Points : 364
    Points
    364
    Par défaut
    tu as un message d'erreur ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Aucun, j'ai même le message de success, puisqu'en soi côté app il n'y a pas de problème : lorsque j'essaye d'enregistrer plus de 1000 lignes, seules les 1000 premières passent, les autres non.

    EDIT : En entrant des données à la main (je suis allez jusqu'à l'id 1350), l'app affiche bien tout..

  4. #4
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    je suis un peu en retard, mais je pense que tu essaye d'en insérer trop d'un coup.
    Tu peux aisément faire un test avec un flush toutes les 50 insertions par exemple.


    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
    17
    18
    19
     
    public function addLinks($data)
    {
    $i = 1;
    		foreach($data as $link) {
    			// Création du lien
    			$lien = new LaisonLink();	// On crée le lien
    			$lien->setLinkParent($link['parent']);
    			$lien->setLinkEnfant($link['enfant']);
    			$lien->setTime(new \DateTime());
     
    			$this->_em->persist($lien);				// On le persiste
    if($i%50==0){
        $this->_em->flush();	
    }
     
    		}
    	$this->_em->flush();	
    }
    Ca devrait t'emener plus loin.
    Après, tu ne teste pas du tout si le lien existe avant de le créer... tu n'a pas de contraintes pour limiter le couple parent / enfant a un seul element ? un même parent peut il etre lié 2 fois avec le même enfant ?

    Pierre

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci Pierre pour ta réponse.

    Aucun souci pour le retard, le problème n'est toujours pas réglé

    Un même parent ne peut pas être lié deux fois avec un même enfant, non.
    Ma page d'administration ou je gère ça est un tableau avec des cases à cocher, du type :
    Lien 1 Lien 2 Lien 3 Lien 4
    Lien 1 non
    Lien 2 x non
    Lien 3 x non
    Lien 4 x non

    Dans cet exemple, les "non" sont des cases impossibles à cocher, les "x" sont les cases cochées, le reste est non coché !

    Je vais essayer ton code, je n'y avait pas penser du tout.

    Encore merci

  6. #6
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    La doc : http://doctrine-orm.readthedocs.org/...rocessing.html

    Pour moi tu devrais faire 1 test : vérifier que ton tableau de contient pas de doublons.
    Ca peut se faire aussi par un truc tout bete, crééer un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tab[$idParent][$idEnfant]= new Array("parent"=>$idParent, "enfant"=>$idEnfant);
    Attention, est-ce que id1->id2 est équivalent a id2->id1
    Peux tu avoir dans ta base ce genre de choses, si c'est le cas il faut tester encore plus. Et même si tu pense maitriser ton système, ta validation d'unicité est faite coté HTML aujourd'hui(ton formulaire te permet uniquement certaines choses) Que se passe t'il si quelqu'un édite le formulaire pour mettre des valeurs fantaisistes en changeant les id manuellement dans les checkbox par exemple.

    Pierre

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci Pierre pour ta réponse.

    id1->id2 n'est pas équivalent a id2->id1, ce qui est un léger problème en soi, puisque pour lier deux liens ensemble, il faut donc cocher deux cases.

    La page d'édition n'est accessible que sur ma plateforme d'administration, donc logiquement, aucun souci à ce niveau la, mais je vois ce que tu veux dire, oui : même si actuellement, il est impossible pour moi d'avoir des doublons, ce test permettrait de s'en assurer.

    Je vais essayer le flush toutes les 50 insertions déjà, et après j'essayerai de mettre en place ce test

    Merci encore pour ton aide!



    EDIT : Cela ne fonctionne pas avec le flush toutes les 50 insertions, c'est le même problème...ou alors faut-il vider le cache de l'app lorsque je modifie un fichier php d'une de mes entity ?

  8. #8
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Dans le doute, tu peux quand tu as des problème bizarre faire ces deux actions :
    ->supprimer ton cache(carrement au niveau fichier)
    -> redémarrer apache(pour vider le cache APC)

    Ca peut aider parfois, j'ai pas mal de problème bizarre résolu de cette façon.

    Pour ton problème, tu bloques maintenant au bout de 50, ou au bout de 1000 ?

  9. #9
    Candidat au Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Toujours à 1000, c'est pour ça que je me suis posé la question du cache.

  10. #10
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Ca prend combien de temps ?
    Tu ne te trouve pas en timeout ?

    Pierre

  11. #11
    Candidat au Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    ça fait exactement comme avant, le même temps a peu près, pas de timeout non.. j'ai relancer mon apache, essayer sur un autre navigateur rien n'y fait..

    J'ai essayer avec ça, comme dans la doc que tu m'a transmis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		if($i%50==0){
        $this->_em->flush();	
        $this->_em->clear();
    }
     
    		}
    	$this->_em->flush();
    	$this->_em->clear();	
    }
     
    }
    Lorsque je coche / décoche des cases, c'est seulement lorsque j'appuye sur envoyer que les données sont transmises, peut être que c'est ça qui ne va pas du coup, non ?

  12. #12
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Honnetement, je ne vois aucune bonne raison pour expliquer ce plantage.

    As tu vérifier dans PHP combien de ligne étaient récupérées ? Si tu enlève le persist et que tu le remplaces par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo $i .": ". $enfant ." " .$parent."<br />";
    Ca te donne quoi ? Si tu ne vois pas plus de ligne affichées, c'est dans PHP ou ton formulaire le pb. Si tu vois tout, c'est le persist qui bloque.

    Pierre

  13. #13
    Candidat au Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    ça ne m'affiche rien, du coup j'ai regardé dans le "network" avec le Developer tools de chrome, j'ai bien 2130 lignes dans le header lors de l'envoi, et bien 1000 cases cochées lorsque la page se rafraîchit avec ajax (1000 lignes cochées dans la réponse)

    le "response header" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HTTP/1.0 200 OK
    Date: Wed, 25 Feb 2015 17:08:29 GMT
    Server: Apache/2.2.22 (Ubuntu)
    X-Powered-By: PHP/5.3.10-1ubuntu3.8
    cache-control: no-cache
    Vary: Accept-Encoding
    Content-Encoding: gzip
    Content-Length: 108
    Connection: close
    Content-Type: text/html; charset=UTF-8
    du coup, ça à l'air d'être côté persist que ça foire, non ?

  14. #14
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    pour que ton test soit visible, désactive ajax

    Tu as juste a soumettre ton formulaire classiquement, en plus ca sera vachement plus simple a tester.

    le but est de bien voir si tu fais un echo, avec ou sans persist dailleur, jusqu'ou tu vas. (d ou l'incrément)


    Tu testes dans des conditions plus complexes, simplifie le problème au possible(en plus tu rendra ton formulaire compatible même sans javascript) et tu pourras mieux comprendre ce qu'il se passe. Un F5 sur ta page résultat devrait dailleur reposter le formulaire, t'évitant d'avoir a le faire plusieurs fois.

    Tu peux avoir des plantages a plusieurs endroits :
    - le persist ou le flush : improbable
    - l'affichage : possible
    - le javascript, en particulier la MAJ de la page : possible
    - des times out divers... un die mal placé qui bloque tout, etc...

Discussions similaires

  1. Persister une entité et flush "plus tard"
    Par solofein dans le forum Doctrine2
    Réponses: 5
    Dernier message: 30/09/2014, 01h45
  2. PEUT ON IMPORTER FICHIER EXCEL PLUS DE 1000 LIGNE?
    Par omarnigth dans le forum Deski
    Réponses: 0
    Dernier message: 04/08/2012, 05h49
  3. Import fichier Excel de plus de 1000 lignes
    Par christelle_s dans le forum Deski
    Réponses: 2
    Dernier message: 10/06/2011, 14h34
  4. Réponses: 3
    Dernier message: 19/05/2006, 20h38
  5. Réponses: 5
    Dernier message: 03/11/2005, 16h54

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