[spip-dev] Souci lors de connexions multiples à plusieurs BDD

Bonjour,

J’utilise le moteur SPIP pour la gestion d’un site qui nécessite une gestion
de sessions (db_eSessions) et fait des accès sur une BDD mysql via une
couche d’abstraction ADODB.

Et SPIP m’a bien l’air de se mélanger les pinceaux dès lors qu’il doit se
connecter à 2 ou 3 BDD …

Le log mysql du pb ets le suivant :

040805 15:26:40 15 Connect user@localhost on

                     15 Init DB spip_test

                     15 Query SELECT COUNT(*) FROM spip_meta

                     15 Query SELECT * FROM spip_meta

                     15 Query SELECT
GET_LOCK('spip_test:spip:CACHE/0/mip-fo_login.7690.5259b3_tmp', 1)

                     15 Query SELECT
RELEASE_LOCK('spip_test:spip:CACHE/0/mip-fo_login.7690.5259b3_tmp')

                     16 Connect user@localhost on ma_bdd

                     16 Init DB ma_bdd

                     16 Query SELECT blabla from TABLE where
n_identifiant='Identifiant'

                     16 Query SELECT
GET_LOCK('spip_test:spip:CACHE/a/header-id_article%3D.7690.b55473_tmp', 1)

                     16 Query SELECT
RELEASE_LOCK('spip_test:spip:CACHE/a/header-id_article%3D.7690.b55473_tmp')

                     16 Query SELECT
GET_LOCK('spip_test:spip:CACHE/b/top.7690.28354b_tmp', 1)

                     16 Query SELECT
RELEASE_LOCK('spip_test:spip:CACHE/b/top.7690.28354b_tmp')

                     16 Query SELECT rubriques.* FROM spip_rubriques
AS rubriques WHERE rubriques.id_parent=0

                     16 Query SELECT
GET_LOCK('spip_test:spip:CACHE/5/menu_rech.7690.c60c44_tmp', 1)

                     16 Query SELECT
RELEASE_LOCK('spip_test:spip:CACHE/5/menu_rech.7690.c60c44_tmp')

                     16 Query SELECT
GET_LOCK('spip_test:spip:CACHE/0/module_recherche.7690.6f2e5e_tmp', 1)

                     16 Query SELECT
RELEASE_LOCK('spip_test:spip:CACHE/0/module_recherche.7690.6f2e5e_tmp')

                     16 Query SELECT
GET_LOCK('spip_test:spip:CACHE/2/footer.7690.51d164_tmp', 1)

                     16 Query SELECT
RELEASE_LOCK('spip_test:spip:CACHE/2/footer.7690.51d164_tmp')

                     16 Query SELECT lang FROM spip_auteurs WHERE
login='admin'

                     16 Query SELECT
GET_LOCK('spip_test:spip:archiver_stats', 0)

                     15 Quit

On a un Init DB sur spip_test qui gère les mécanismes de cache.

Puis un Init DB sur une autre BDD (ici en pconnect) afin d’y faire mes
requêtes pour construire le contenu de la page.

Et quand SPIP plus tard, lors de la construction du menu cherche à faire son
SELECT rubriques.* FROM spip_rubriques AS rubriques WHERE
rubriques.id_parent=0, il le fait sur la BDD ma_bdd et conduit à un
magnifique :

Erreur MySQL
SELECT rubriques.* FROM spip_rubriques AS rubriques WHERE
rubriques.id_parent=0
Table 'ma_bdd.spip_rubriques' doesn't exist

Les handlers sont bien entendu différents ($spip_mysql_link et
$conn_ma_bdd).

Si j’utilise connect au lieu de pconnect, en refermant le handler, j’ai le
même souci sauf que SPIP n’est alors plus connecté à une base …

Je ne sais pas si qq’un a déjà eu ce pb, et je n’arrive pas à le debuguer
proprement …

Est-ce un bug ? Ou est-ce que je passe à côté de qq chose … :o/ ?

En attendant, pour pallier salement à ce pb, j’ai dû commenter dans le
fichier ecrire/inc_connect.php3 la ligne :

if (defined("_ECRIRE_INC_CONNECT")) return;

Et includer ce fichier inc_connect.php3 après mes requêtes à la base ma_bbb

Merci,

Antony

Bonjour,

Et SPIP m’a bien l’air de se mélanger les pinceaux dès lors qu’il doit se connecter à 2 ou 3 BDD …

C'est en fait à priori PHP qui partage une unique connexion à MySQL pour les deux bases, au moins dans les versions datant un peu (il me semble que cela a changé).

Il faut donc faire un mysql_select_db() avant chaque requête pour que cela marche ...

-Nicolas

Ben, c'est pas du vieux pourtant ...
Versions :
  PHP : 4.3.3
  Mysql : 4.1.2-1
  SPIP : 1.7.2

-----Message d'origine-----

en rentrant un peu dans le sujet, mais différemment (désolé si je change un
peu la discussion) je voulais savoir si c'était normal :
J'ai un spip installé dans un répertoire qui se trouve à la racine
www.site.com/site/ici lesfichiers spip (1.8.3a)
J'ai voulu déplacer spip à la racine alors j'ai installé les fichiers à la
racine. Je voulais enfin tout effacer
la db et réinstaller la sauvegarde à la racine en supprimant le répertoire
/site. Mais je n'ai point fait ca,
lorsque j'ai placé les fichiers à la racine, j'ai installé spip (qui était
déjà installé dans le répertoire), et il à utilisé
la base déjà présente. Ainsi maintenant la bd est liée au spip qui est à la
racine et au spip qui est dans le répertoire.
Je suppose que c'est normal et qu'il n'y à rien d'anormal mais veux
m'assurer si c'est vraiment le cas.
Merci

Fulvio

"Nicolas Hoizey" <nicolas@hoizey.com> a écrit dans le message de
news:41123A98.3010603@hoizey.com...
Bonjour,

Et SPIP m’a bien l’air de se mélanger les pinceaux dès lors qu’il doit
se connecter à 2 ou 3 BDD …

C'est en fait à priori PHP qui partage une unique connexion à MySQL pour
les deux bases, au moins dans les versions datant un peu (il me semble
que cela a changé).

Il faut donc faire un mysql_select_db() avant chaque requête pour que
cela marche ...

-Nicolas

C'est en fait à priori PHP qui partage une unique connexion à MySQL pour les deux bases, au moins dans les versions datant un peu (il me semble que cela a changé).

Il faut donc faire un mysql_select_db() avant chaque requête pour que cela marche ...

>

Ben, c'est pas du vieux pourtant ...
Versions :
  PHP : 4.3.3
  Mysql : 4.1.2-1
  SPIP : 1.7.2

Dans la doc de PHP :
http://fr3.php.net/manual/fr/function.mysql-query.php

« mysql_query() envoie la requête SQL query à la base de données actuellement active sur le serveur MysQL. »

Il y a eu une discussion à ce sujet dernièrement sur pear-dev, parce que PEAR::DB fait justement un mysql_select_db() avant chaque mysql_query():

http://marc.theaimsgroup.com/?l=pear-dev&m=109051095126475&w=2

-Nicolas

Ce que devrait faire SPIP si je ne me trompe non ?

-----Message d'origine-----

Ce que devrait faire SPIP si je ne me trompe non ?

Ou alors ton propre script pourrait rendre à SPIP sa connexion ... :wink:

-Nicolas

Ce que devrait faire SPIP si je ne me trompe non ?

Ben, c'est pas evident en fait, car spip utilise un cache et qu'on a pas
forcement interet à ce que 2 calculs de cache aient lieu en meme temps.
Si le systeme de verrou est assez fin, Spip devrait effectivement pouvoir
permettre deux calculs en meme temps si ils n'impactent pas les memes
fichiers de cache mais avec les inclusions, c'est pas trivial ...
Sans compter que les accès en eciture ne se gerent encore pas de la meme
facon (il a été question d'utiliser une connection juste pour l'ecriture à
un moment, kje ne sais pas ou ca en est).
Donc en fait, c'est peut etre pas plus mal que Spip n'utilise qu'une
connexion et en tous ca, passer à plusieurs connexions n'est pas forcement
anodin.
@++

Antony SIMONNEAU wrote:

Bonjour,

J’utilise le moteur SPIP pour la gestion d’un site qui nécessite une gestion de sessions (db_eSessions) et fait des accès sur une BDD mysql via une couche d’abstraction ADODB.

Et SPIP m’a bien l’air de se mélanger les pinceaux dès lors qu’il doit se connecter à 2 ou 3 BDD …

C'est normal.
Si tu veux ouvrir plusieurs bases en même temps, il faut
demander à SPIP de faire des accès complets à la base (avec sélection de la base à chaque requête). Pour ca, renseigner la variable
$mysql_rappel_connexion = true ;
dans ecrire/mes_options.php3 [2].

Hop.

Désolé GoUaRfIg!, je viens de voir ton article sur spip_contrib ... il est passé
au travers de mes recherches sur google (
http://www.spip-contrib.net/article.php3?id_article=451). C'est plus clean !
Un grand merci ;o)
Et hop ! ;op

Selon GoUaRfIg! <gouarfig@hotmail.com>: