J'ai un problème lorsque j'utilise Apache :: DBI dans les processus enfants. Le problème est que Apache :: DBI fournit une poignée unique pour tous les processus qui l'utilisent, donc je reçoisQuel est le moyen sûr d'utiliser fork avec Apache :: DBI sous mod_perl2?
DBD :: mysql :: db selectall_arrayref échoué: Commandes désynchronisés; vous ne pouvez pas exécuter cette commande maintenant à /usr/local/www/apache22/data/test-fork.cgi ligne 20.
Reconnexion ne fonctionne pas, car Apache :: DBI reconnecte en tous les processus, comme je l'ai compris l'erreur suivante
le serveur a rencontré une erreur interne et n'a pas pu terminer votre demande .
Message d'erreur: pilote DBD n'a pas mis en œuvre l'attribut AutoCommit à /usr/local/lib/perl5/site_perl/5.8.9/Apache/DBI.pm ligne 283.,
Voici le code d'origine:
use Data::Dumper 'Dumper';
use DBI();
my $dbh = DBI->connect($dsn, $username, $password, {
RaiseError => 1,
PrintError => 0,
});
my $file = "/tmp/test-fork.tmp";
my $pid = fork;
defined $pid or die "fork: $!";
if ($pid) {
my $rows = eval { $dbh->selectall_arrayref('SELECT SLEEP(1)') };
print "Content-Type: text/plain\n\n";
print $rows ? "parent: " . Dumper($rows) : [email protected];
}
else {
my $rows = eval { $dbh->selectall_arrayref('SELECT SLEEP(1)') };
open FH, '>', $file or die "$file: $!";
print FH $rows ? "child: " . Dumper($rows) : [email protected];
close FH;
}
le code j'ai utilisé pour rebranchement:
...
else {
$dbh->disconnect;
$dbh = DBI->connect($dsn, $username, $password, $attrs);
my $rows = eval { $dbh->selectall_arrayref('SELECT SLEEP(1)') };
open FH, '>', $file or die "$file: $!";
print FH $rows ? "child: " . Dumper($rows) : [email protected];
close FH;
}
Existe-t-il un moyen sûr d'utiliser Apache :: DBI avec forking? Y a-t-il un moyen de le faire créer une nouvelle connexion peut-être?
Votre première option ne fonctionne pas pour moi. L'as tu essayé? – codeholic
@codeholic: qu'est-ce que vous voulez dire par ça ne marche pas? Vous devrez appeler à nouveau '$ dbh = DBI-> connect (...)' car le $ dbh est maintenant indéfini. – Ether
@codeholic: D'accord, je pense que tout dans ma réponse est un faux-fuyant - vous semblez avoir quelque chose d'autre qui se passe. c'est-à-dire que "quelque chose" passe incorrectement l'attribut AutoCommit. Ce problème est-il quelque chose de nouveau qui vient de commencer ou l'avez-vous toujours eu? Je suppose qu'il se passe quelque chose de bizarre dans tes configs. – Ether