Anomalie #5934
ferméProblème mise en cache du document tardive dans Doc::postInsert() et taille du cache
100%
2 problèmes distincts sont présentés dans la demande.
1°) Mise en cache & postCreated
Effectivement la mise en cache d'un nouveau document et fait après l'appel de postCreated.
Il faut que cette mise en cache soit faite avant cet appel et après le "add" (enregistrement en BD et obtention de l'id).
2°) Taille du cache
Le cache est limité à 20. Les 20 premiers appels à new_doc ou à doc::store (dans le cas de la création).
L'appel à Doc::store() ne met pas l'objet en cache s'il s'agit d'une mise à jour.
La solution consiste à rendre paramétrable cette limite par un paramètre applicatif et par programmation.
Il pourra être possible d'indiquer "sans limite" en indiquant -1. (0 indiquant aucun cache).
Il est cependant à noter que certaine action de core ou autre module Dynacase utilise ce cache. Donc je propose
que la limite historique à 20 ne puisse par être diminuée mais juste augmentée.
il est envisagé de documenter le fonctionnement de ce cache afin de pouvoir :
- Changer la limite
- Ajouter un élément dans le cache
- Vider le cache (globalement ou par document)
L'alternative à cette documentation de fonction "interne" à core et de mettre à disposition
le documentManager qui réalise les mêmes fonctions que la fonction "new_doc" mais qui a l'avantage de
regrouper les fonctions d'accès et d'offrir des méthodes homogène d'accès aux documents unitaires et à la
gestion de ce cache - qui n'est pas un cache avec la BD mais une zone de partage d'objet documentaire.
En fichier joint, j'ai juste fait une stat sur la mémoire consommée par un "new_doc" basique.
Ici (en PHP5.6) on atteint 6Mo pour 100 documents "simple" et 60Mo sur php5.4 avec document complexe)
Description
Dans `Doc::postInsert()`, le document créé est mis dans le cache `$gdocs` après le déclenchement de `Doc::postCreated()`. Cela à pour effet de bord de faire que le code exécuté dans le `postCreated()` de la famille n'a pas le document dans le cache et qu'il est donc possible qu'un nouvel objet distinct correspondant à ce document soit instancié, et donc faire que les données du document en base de données seront différentes en fonction du dernier objet sur lequel sera appelé le `store()`.
Pour éviter cela, il faudrait que le document créé soit immédiatement mis en cache après le `modify()` effectué par `postInsert()` et avant de déclencher `postCreated()`.
De plus, le fait que la mise en cache ne se fasse pas lorsque la taille max du cache est atteinte peut aussi entraîner des effets de bord de ce type, possibilité d'instancier deux objets distinct d'un même document Dynacase.
Fichiers