Hi everyone

I have a problem that I can't figure. I've got two virtual hosts on
one server. They both point to different directories as the
DocumentRoots, however the mod_perl scripts in each directory are
identical in name and content.

My problem is that SOMETIMES while accessing one virtual host, it will
appear as though it is actually pulling data from the other virtual
host's database (each virtual host uses a different database as shown
below), however the URL does not change. All the links, etc, continue
to point to the right domain, however the data is just wrong (and only
intermittently).

Here is how the two virtual hosts are declared in httpd.conf:

------------------------------------------------------------------------
<VirtualHost 12.34.56.78>
    ServerName demo.domain.com
    ServerAdmin [EMAIL PROTECTED]
    DocumentRoot /var/www/ors/demo
    ErrorLog /var/www/ors/logs/demo-error_log
    CustomLog /var/www/ors/logs/demo-access_log common
    PerlModule Apache::Registry
    PerlModule Apache::DBI
    PerlRequire /var/www/ors/demo/startup.pl
    PerlFreshRestart On
    PerlWarn on
    PerlSetVar DBASE  DBI:mysql:host=localhost;database=rostering_demo
    PerlSetVar DBUSER username
    PerlSetVar DBPASS password

    <Directory /var/www/ors/demo>
        <Files ~ "\.pl$">
            SetHandler perl-script
            PerlHandler Apache::Registry
            PerlSendHeader On
        </Files>
        Options ExecCGI Indexes MultiViews FollowSymLinks
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

<VirtualHost 12.34.56.78>
    ServerName london.domain.com
    ServerAdmin [EMAIL PROTECTED]
    DocumentRoot /var/www/ors/london
    ErrorLog /var/www/ors/logs/london-error_log
    CustomLog /var/www/ors/logs/london-access_log common
    PerlModule Apache::Registry
    PerlModule Apache::DBI
    PerlRequire /var/www/ors/london/startup.pl
    PerlFreshRestart On
    PerlWarn on
    PerlSetVar DBASE  DBI:mysql:host=localhost;database=rostering_london
    PerlSetVar DBUSER username
    PerlSetVar DBPASS password

    <Directory /var/www/ors/london>
        <Files ~ "\.pl$">
            SetHandler perl-script
            PerlHandler Apache::Registry
            PerlSendHeader On
        </Files>
        Options ExecCGI Indexes MultiViews FollowSymLinks
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
------------------------------------------------------------------------

The startup.pl files are like:

------------------------------------------------------------------------
#!/usr/bin/perl
use Apache::DBI;
use Apache::Registry;
use Apache::RegistryLoader;
use DBI;
use DBD::mysql;
use strict;

Apache::RegistryLoader->new->handler("/roster.pl",
                                     "/var/www/ors/london/roster.pl",
                                     "london.domain.com");

Apache::DBI->connect_on_init('DBI:mysql:rostering_london:localhost',
                             'username',
                             'password',
                             {  RaiseError => 0,
                                AutoCommit => 1,
                                PrintError => 1 } )
    or die $DBI::errstr;

Apache::DBI->setPingTimeOut('DBI:mysql:rostering_london:localhost', 60);
1;
------------------------------------------------------------------------

(and the other is identical other than the handler and connect_on_init
lines)

roster.pl is the main script, which simply use's a package in ./ORS/
and then calls its main() sub. The main() sub in this package then
does:

------------------------------------------------------------------------
use Apache;
my $r = Apache->request;
$dbstr  = $r->dir_config('DBASE');
$dbuser = $r->dir_config('DBUSER');
$dbpass = $r->dir_config('DBPASS');
------------------------------------------------------------------------

Every time I need database access, I simply do a:

my $dbh = DBI->connect($dbstr,$dbuser,$dbpass)

I've made these variables available throughout the entire package by
using a use vars qw() in the BEGIN of this package, and I've made them
available to other packages by exporting them. Below is how I did
this:

------------------------------------------------------------------------
BEGIN {

  use vars qw(
              %config
              %help
              $dbstr
              $dbuser
              $dbpass
              $debug
             );

  use Exporter ();
  @ORS::Main::ISA         = qw(Exporter);
  @ORS::Main::EXPORT_OK   = qw(
                               %config
                               %help
                               $dbstr
                               $dbuser
                               $dbpass
                               $debug
                              );
}

use vars @ORS::Main::EXPORT_OK;
use vars qw/$action/;
use ORS::Subs qw(:DEFAULT);

sub main {
------------------------------------------------------------------------

They are then imported into other packages with:

------------------------------------------------------------------------
BEGIN {

  # Import some variables
  use vars qw(
              %config
              %help
              $dbstr
              $dbuser
              $dbpass
              $debug
             );
  use ORS::Main qw(
                   %config
                   %help
                   $dbstr
                   $dbuser
                   $dbpass
                   $debug
                  );
}
------------------------------------------------------------------------

I hope I have provided all the info I need... I've been working on
this software for about 12 months flawlessly and have only just tried
using it on multiple virtual hosts to encounter this problem. I'm sure
its more my methodology than anything so any help/pointers on how best
to do this would be great!

Thanks,

Brett Randall.

-- 
Report problems: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html
List etiquette: http://perl.apache.org/maillist/email-etiquette.html

Reply via email to