Anomalie #16925
ouvert[PDO] les requêtes préparées ne sont pas libérées
Description
Maarch Courrier 20.10.10
Pour mon problème de script qui prenait toute la RAM, j’ai avancé. Voir l’image jointe pour se rendre compte de la gravité du problème, toute la mémoire vive et le swap sont occupés, soit plus de 20Go.
Ce sont des process postgres qui prennent la mémoire, pas php. En coupant mon script PHP la mémoire n’est pas libérée, ni en redémarrant PostgreSQL, mais en faisant un restart d’apache ça libère la mémoire. Donc pour moi le problème vient de Courrier. J’ai été voir dans les sources qui gèrent le PDO et j’ai fait cette petite modification :
diff --git a/src/core/models/DatabasePDO.php b/src/core/models/DatabasePDO.php
index 7328049bc5..08deb5b045 100755
--- a/src/core/models/DatabasePDO.php
+++ b/src/core/models/DatabasePDO.php
@@ -20,6 +20,10 @@ class DatabasePDO
private static $type = null;
private static $preparedQueries = [];
+ public function __destruct() {
+ self::$preparedQueries = [];
+ }
+
public function __construct(array $args = [])
{
if (!empty(self::$pdo)) {
et ça semble fonctionner.
J’ai testé en mettant self::reset()
; dans le destructeur mais la recherche ne fonctionnait alors plus vu qu’il y a apparemment des tables temporaires dans la connexion.
Cette solution intermédiaire de détruire les requêtes préparées semble améliorer grandement l’utilisation de la mémoire, peut-être au détriment de la vitesse d’exécution, mais pas d’une façon que j’ai pu ressentir en tant qu’utilisateur.
Pouvez-vous valider que cette modification n’aura pas d’impact fonctionnel bloquant pour les utilisateurs, hormis un léger ralentissement ?
La modification ne serait à appliquer que le temps d’exécution d’un script de reprise de données à usage unique.
Fichiers