Bonjour à tous, je me tourne vers vous car après de nombreuses recherches, je ne trouve pas la raison d'une serialization qui prend 30 secondes voir infinie..
Le contexte : je souhaite (mettre à jour / actualiser) une liste déroulante ( bouton dropdown ) en fonction du choix ( clique ) sur un autre élément d'une autre liste déroulante, ceci en AJAX.
Une entité "Sous-groupe" lié en OneToMany à une entité "Skill".
Je récupère l'id du sous-groupe sélectionné comme ceci :
Voici ma fonction AJAX qui envoie l'id du sous-groupe sélectionné et me renvoi une liste d'options correspondantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <div class="col-md-3 pt-3"> <div class="form-group"> <select class="form-control" id="inputSubGroup" onchange="test('{{ path('test') }}')"> <option id="test" selected value="0">Sous-groupe</option> {% for subgroup in subgroups %} <option value="{{subgroup.id}}"> {{subgroup.label}}</option> {% endfor %} </select> </div> </div>
Jusqu'ici tout fonctionne bien, passons côté Controlleur :
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 function test(path) { var inputSubGroup = document.getElementById("inputSubGroup"); var subGroupId = inputSubGroup.options[inputSubGroup.selectedIndex].value; $.ajax({ url: path, type: "GET", data: {"subGroupId": subGroupId}, dataType: "json", async: true, cache:false, success: function (data) { console.log(data); var content = ''; for (var i = 0; i < data.length; i++) { content += '<option value="' + data[i].id + '">' + data[i].label + '</option>'; } $('#inputSkill').empty(); $('#inputSkill').html(content); }, error: function(data) { console.log('test Ajax Error'); } }); }
Ici le
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 /** * @Route("/test", name="test") */ public function test(SerializerInterface $serializer, Request $request) { $subGroupId = $request->query->get('subGroupId'); $result = $this->skillRepository->findBy(['subgroup' => $subGroupId]); //dump($result);die('result'); $data = $this->serializer->serialize( $result, 'json', SerializationContext::create()->enableMaxDepthChecks() ); $response = new Response($data); $response->headers->set('Content-Type', 'application/json'); return $response; }me renvoie correctement l'objet en question en un temps record :
Code : Sélectionner tout - Visualiser dans une fenêtre à part dump($result);die('result');
Sans serializer cela me renvoyer un objet vide , j'utilise donc le Serializer JMSSeriazlierBundle pour sérizalier l'objet avant de l'envoyer en Type Response.
Lorsque je sélectionne un sous-groupe, soit cela prend environ 20secondes..
Soit cela prend un temps infini jusqu'a cette erreur :
Je pense donc que cela vient de la Serialization de l'objet, comment améliorer la performance de celui-ci ? Qu'est-ce que je fais de mal.. Merci d'avance !OutOfMemoryException
Error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 41947136 bytes)
in JsonSerializationVisitor.php line 186
EDIT : J'ai rajouté une Politique d'exclusion au sein de ma Classe qui contient les compétences.
Dans le cas où nous ne souhaitons pas montrer l'un des champ, il faut faire appel à la politique d'exclusion : en effet, par défaut, tous les champs sont sérialisés. Pour retirer un champ, il faut tout exclure, puis n'exposer que les éléments que l'on souhaite retrouver.
Effectivement, dorénavant la requête met moins d'une seconde à s’exécuter, car il ne serialize plus tous les champs qui sont en relation avec d'autres Entités.. un bonheur![]()
Partager