OVH Cloud OVH Cloud

problème mod_perl & DBI

5 réponses
Avatar
paul POULAIN
Bonjour/soir,

Nous tentons de faire fonctionner Koha (application web, écrite en Perl)
sous mod_perl.

Comme Koha n'a pas été prévu pour fonctionner en mod_perl, nous utilisons
Apache::Registry, avec la configuration décrite ci-dessous.

Ca fonctionne plutôt bien, sauf pour quelques script (pas tous !)
pour lesquels, au début, cela fonctionne, et les fois suivantes, on semble
avoir perdu les coordonnées de la base de données ou qqc du genre, parce
qu'il affiche des listes vides (ou des formulaires vides) alors que les
paramètres sont bien passés.

quelqu'un a t'il une idée ???

Configuration :
* dans l'hote virtuel concerné :
> PerlRequire /home/paul/koha.dev/rel_3_0/startup.pl

* startup.pl contenant :
> #!/usr/bin/perl
>
> use strict;
> use warnings;
> use lib qw(home/paul/koha.dev/rel_3_0/); # this line fixe PERL5LIB !
>
> # you can add here what you want.
> # see perl.apache.org for more details.
>
> 1; # don't forget to add it.

* La config Apache générale est :
> <Files *.pl>
> SetHandler perl-script
> PerlResponseHandler ModPerl::Registry
> PerlOptions +ParseHeaders
> PerlSendHeader On
> Options +ExecCGI
> </Files>

Le problème est constaté sous mandriva aussi bien que sous ubuntu
--
Paul

5 réponses

Avatar
Paul Gaborit
À (at) Tue, 12 Dec 2006 17:43:24 +0100,
paul POULAIN écrivait (wrote):
Nous tentons de faire fonctionner Koha (application web, écrite en Perl)
sous mod_perl.

Comme Koha n'a pas été prévu pour fonctionner en mod_perl, nous uti lisons
Apache::Registry, avec la configuration décrite ci-dessous.

Ca fonctionne plutôt bien, sauf pour quelques script (pas tous !)
pour lesquels, au début, cela fonctionne, et les fois suivantes, on sem ble
avoir perdu les coordonnées de la base de données ou qqc du genre, pa rce
qu'il affiche des listes vides (ou des formulaires vides) alors que les
paramètres sont bien passés.

quelqu'un a t'il une idée ???

Configuration :
* dans l'hote virtuel concerné :
PerlRequire /home/paul/koha.dev/rel_3_0/startup.pl


* startup.pl contenant :
#!/usr/bin/perl

use strict;
use warnings;
use lib qw(home/paul/koha.dev/rel_3_0/); # this line fixe PERL5LIB !



Ici, il manque un '/' au début du chemin...

# you can add here what you want.
# see perl.apache.org for more details.

1; # don't forget to add it.


* La config Apache générale est :
<Files *.pl>
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
PerlOptions +ParseHeaders
PerlSendHeader On
Options +ExecCGI
</Files>


Le problème est constaté sous mandriva aussi bien que sous ubuntu


Je ne vois rien en lien avec une base de données donc je ne comprends
pas la description de votre problème...

Que disent les logs ?

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
paul POULAIN
Paul Gaborit wrote:
Je ne vois rien en lien avec une base de données donc je ne comprends
pas la description de votre problème...

Que disent les logs ?



C'est un peu compliqué à décrire, je suis d'accord, mais je vais essayer de
préciser...

Tout d'abord l'URL :
http://i18.bureau.paulpoulain.com/cgi-bin/koha/admin/branches.pl
(login test/test)

Il y a 2 comportements différents :
- la page est bien chargée : il y a 3 lignes avec les 3 sites (code CPR, IPT
et X) Ces 3 sites sont récupérés en lisant une table mySQL qui s'appelle
branches.
- la page se charge, mais la liste est vide.

Pour continuer à apporter des précisions :
- les logs sont tout à fait vides :-(
- le problème se pose dans 3 pages sur >200 que compte Koha
- ca fonctionne parfaitement sans mod_perl
- la BD est ouverte avec un package spécifique (Context.pm) :
sub _new_dbh
{
$db_driver="mysql";
my $db_name = $context->config("database");
my $db_host = $context->config("hostname");
my $db_user = $context->config("user");
my $db_passwd = $context->config("pass");
my $dbh= DBI->connect("DBI:$db_driver:$db_name:$db_host",
$db_user, $db_passwd);
# Koha 3.0 is utf-8, so force utf8 communication between mySQL and
koha, whatever the mysql default config.

# this is better than modifying my.cnf (and forcing all communications
to be in utf8)

$dbh->do("set NAMES 'utf8'");
return $dbh;
}



Je précise, histoire de mettre la pression, qu'on est supposé passer en
production le 3 janvier, et que sans mod_perl, ça ne tient pas bien la
charge du tout (100 utilisateurs)
Donc hhheeeeeeeeeelllllllllppppppppppppppp ;-)
--
Paul

Avatar
paul POULAIN
Au final, c'était pas un pb DBI, mais un pb HTML::Template.
html::template n'aime PAS du tout (en mod_perl) la construction suivante :

#! /usr/bin/perl
my $template= template->new(...);
sub dothis {
$template->param(param => 'XXX');
}
if ($qqc) {
dothis();
}


Si on passe le template en paramètre à dothis, ca marche parfaitement.
(d'ailleurs, la syntaxe qui ne marche pas ne me semble pas bien rigoureuse &
source de pb à la maintenance : on met une fonction au milieu d'un script)
--
Paul
Avatar
Paul Gaborit
À (at) Wed, 13 Dec 2006 09:26:01 +0100,
paul POULAIN écrivait (wrote):
Il y a 2 comportements différents :
- la page est bien chargée : il y a 3 lignes avec les 3 sites (code CPR , IPT
et X) Ces 3 sites sont récupérés en lisant une table mySQL qui s'ap pelle
branches.
- la page se charge, mais la liste est vide.


Je vois plusieurs causes possibles dont :

Apache est multi-thread et/ou multi-processus, on peut donc supposer
que différents threads et/ou processus donnent des résultats
différents.

mod_perl autorise les variables persistantes et c'est peut-être une
valeur persistante qui provoque ce changement de comportement.

Pour tenter de séparer les deux cas, on peut configurer Apache pour
qu'il ne crée qu'une seule instance (thread et/ou processus). Si le
bug continue à se manifester, c'est qu'on est dans la seconde
situation.

Pour continuer à apporter des précisions :
- les logs sont tout à fait vides :-(


Donc Apache et mod_perl sont toujours contents : ils trouvent tous les
scripts, tous les modules et la connexion à la base s'effectue
toujours bien.

- le problème se pose dans 3 pages sur >200 que compte Koha


Ce sont toujours les mêmes pages qui posent problèmes ? Dans ce cas,
il faut rechercher ce qu'elles ont en commun et que n'ont pas les
autres. De plus, cela ne milite pas pour un problème entre les
instances d'Apache mis à part sur un paramètre spécifique à ces 3
pages.

- ca fonctionne parfaitement sans mod_perl


Ça, ce n'est malheureusement pas un critère suffisant de réussite.
L'inverse est un critère suffisant d'échec (un peu comme la preuve par
neuf).

- la BD est ouverte avec un package spécifique (Context.pm) :
sub _new_dbh
{
$db_driver="mysql";
my $db_name = $context->config("database");
my $db_host = $context->config("hostname");
my $db_user = $context->config("user");
my $db_passwd = $context->config("pass");
my $dbh= DBI->connect("DBI:$db_driver:$db_name:$db_host",
$db_user, $db_passwd);
# Koha 3.0 is utf-8, so force utf8 communication between mySQL and
koha, whatever the mysql default config.

# this is better than modifying my.cnf (and forcing all communicatio ns
to be in utf8)

$dbh->do("set NAMES 'utf8'");
return $dbh;
}



Cette initialisation de la connexion se fait normalement dans chaque
instance d'Apache et persiste d'une requête à l'autre. Est-ce le cas ?

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
Paul Gaborit
À (at) Wed, 13 Dec 2006 11:18:17 +0100,
paul POULAIN écrivait (wrote):
Au final, c'était pas un pb DBI, mais un pb HTML::Template.
html::template n'aime PAS du tout (en mod_perl) la construction suivante :

#! /usr/bin/perl
my $template= template->new(...);
sub dothis {
$template->param(param => 'XXX');
}
if ($qqc) {
dothis();
}


Si on passe le template en paramètre à dothis, ca marche parfaitement.
(d'ailleurs, la syntaxe qui ne marche pas ne me semble pas bien rigoureus e &
source de pb à la maintenance : on met une fonction au milieu d'un scri pt)


Une variable globale ! Beurk !

Les variables globales (mal gérées) sont sources de problèmes...
particulièrement avec mod_perl.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>