Connexion unique base de données php

a marqué ce sujet comme résolu.

Bonsoir chers amis dans le dévéloppement de mon site web j’ai un dossier model dans lequel j’ai un fichier model.php qui contient toutes les requetes de ma base de données qui sont chacuns dans une fonction.

Mais dans chaque fonction je me connecte toujours a la base de données. J’aimerais faire une seule connexion pour toutes les requêtes.

Pour cela je compte créer une variable globale et l’utiliser dans toutes les fonctions ets-ce la meilleure maniere de faire.

Merci pour vos réponses.

Il y a mieux qu’une immonde variable globale : un "singleton".

PS : Les variables globales ne sont pas plus immondes dans l’absolu que le pattern singleton n’est différent d’une variable globale. C’est l’idée de gérer un état mutable partagé globalement sans aucun mécanisme de protection contre les accès concurrents qui est immonde.

Tu as raison sauf que tu généralises et ta réponse est plus de l’ordre de la théorie. Mes propos visent spécifiquement PHP :

  • contrairement au C, par exemple, déjà, tu ne peux pas limiter la portée de ta variable (le static du C si on la souhaitait propre à un fichier)
  • il y a des langages ou des situations où tu n’as pas le choix (c’est assez fréquent en C aussi quand tu aurais besoin de trimbaler une donnée de fonctions en fonctions mais que la bibliothèque que tu utilises ne prévoit rien pour passer de telles données contextuelles). Or, lui, il a le choix là.

En PHP c’est vraiment la solution de dernier recours parce que c’est le meilleur moyen de perdre son temps à chercher d’où elle sort, à quoi elle correspond et, si tu l’écrases par inadvertance, à chercher un bug qui n’aurait même pas dû exister au départ.

+0 -1

Hmm, avant de se jeter dans le design pattern le plus controversé de la planète : pourquoi diable voudrais-tu faire ça ?

As-tu mesuré des problèmes de performance ? Caractérisé que ces connexions étaient un goulot d’étranglement ?

Que fais-tu quand cette connexion tombe ? Car elle peut tomber, donc la loi de Murphy nous dit qu’elle VA tomber.

Pour éviter d’introduire cette nouvelle classe de problèmes, dans les applications qui ont vraiment besoin d’éviter les reconnexions intempestives ce n’est pas une connexion unique que l’on utilise, mais un pool de connexions, mais cela semble très louche pour une application en PHP.

Enfin, si tu as vraiment un problème de perfs, il y a de grandes chances pour que cela soit réglé beaucoup plus efficacement par un cache que par la réutilisation des connexions à la BDD.

PS : Les variables globales ne sont pas plus immondes dans l’absolu que le pattern singleton n’est différent d’une variable globale. C’est l’idée de gérer un état mutable partagé globalement sans aucun mécanisme de protection contre les accès concurrents qui est immonde.

+1 -0

La première question, la plus importante à laquelle répondre c’est : pourquoi vouloir partager une connexion unique ?

Je pense que tu ne te rends pas du tout compte à quel point avoir une connexion unique et partagée va te ramener des problèmes et fragiliser ton application. Du coup, avant même d’envisager faire quoi que ce soit, il faut déjà déterminer que tu en as vraiment besoin et que le bénéfice escompté dépasse le tas d’emmerdes qui vont l’accompagner.

Si tu demandes comment profiler ton application, c’est que tu ne sais même pas encore si cette opération est coûteuse ou non, du coup ça a juste l’air d’être "je fragilise mon application sur un coup de tête".

Lorsque la connexion tombe je spécifie qu’il y a un erreur et j’arrête l’opération.

Sauf que si ta connexion est partagée par tout le monde, alors plus aucune opération n’est possible : c’est plus seulement une opération isolée qui crame, mais toute l’application.

+0 -0

En general on utilise pas une seule connexion partagée entre les requêtes. On ouvre une connexion quand on a besoin de la DB, on fait ce qu´on a à faire, puis on ferme la connexion.

Bien-sûr, il y a un certain overhead à ouvrir et fermer des connexions à chaque requête. Pour résoudre ce problème, il y a les pool dont nohar parle. Il s´agit d´un programme externe (ex. pgBouncer) ou bien d´une feature déjà integrée au driver DB qui permet de maintenir des connexions déjà ouvertes, qui n´auront plus qu´à être empruntées et rendues par ton application, là où avant elles étaient ouvertes et fermées.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte