Um, string-y eval under mod_perl can be a really, really bad idea, given that it can start a whole new interpreter instance. I'd suggest testing this thoroughly before attempting it in any production server.
| [reply] |
You already have an interpreter instance if you are running code under mod_perl. String eval under mod_perl does have the same downsides that it does in any other perl code though.
| [reply] |
Nice to see a familiar mod_perl'er on the PM site :) (Hi Perrin).
FWIW, the code in question is a DB_Connect sub that calls Apache::DBI's DBI->connect. So I've got lots of select/udpate subroutines, and they each call the DB_Connect sub at the beginning to get a database handle. I'd consider just making the $dbh a global var, but then I'd lose the implicit Apache::DBI ping/reconnect.
sub DB_connect {
return DBI->connect(
$Const::DB_Name,
$Const::DB_User,
$Const::DB_Pass,
{ PrintError => 1, RaiseError => 1, AutoCommit => 1 }
) || die "DATABASE CONNECTION ERROR: " . $DBI::errstr . "\n";
}
Anyways, running DProf shows that the frequent DB_Connect calls are sucking extra CPU cycles, so I thought (if there was an easy way to try it) I'd just inline my DBI->connect subroutine. I know, you're saying "that's not the problem" or "that's a fishing expedition", etc. Very possible... and that's why I was hoping there was a very easy way to test inlining the sub.
I'm not crazy about the notion of using eval '', particularly since it looks like from the first suggestion given that I have to eval all of my calling subs, which is alot. Really, ideally, I think even a C-style preparser #define would do the trick.... if one existed in Perl...
MFN | [reply] [d/l] |