Perl RegistryPrefork应该使我的旧cgi工作,但是

Perl RegistryPrefork应该使我的旧cgi工作,但是,perl,web-applications,cgi,mod-perl2,Perl,Web Applications,Cgi,Mod Perl2,我在CGI.pm下开发了一个web应用程序。我想切换到mod_perl2。 我的webapp在CGI下工作,但当我尝试更改mod时,它不再工作,而我没有更改webapp中的任何内容,除了在mod_perl下运行的apache conf文件 我已安装mod-perl2,并将虚拟主机配置为: Alias /project1/ /var/www/v6/cgi-bin/ PerlModule Apache::DBI PerlModule ModPerl::RegistryPrefork <

我在CGI.pm下开发了一个web应用程序。我想切换到mod_perl2。 我的webapp在CGI下工作,但当我尝试更改mod时,它不再工作,而我没有更改webapp中的任何内容,除了在mod_perl下运行的apache conf文件

我已安装mod-perl2,并将虚拟主机配置为:

Alias /project1/  /var/www/v6/cgi-bin/

PerlModule Apache::DBI
PerlModule ModPerl::RegistryPrefork

  <Directory /var/www/v6/cgi-bin/ >

        PerlOptions -SetupEnv
    SetHandler perl-script
    PerlResponseHandler ModPerl::RegistryPrefork
    PerlOptions +ParseHeaders
    Options +ExecCGI
    Order allow,deny
    Allow from all

  </Directory>
Apache2在日志中写入错误:

[Thu Feb 3 17:35:13 2011]-e:DBI 连接(“:”,“…”)失败:访问 拒绝用户“www data”@“localhost” (使用密码:否)在 lib/Connexion.pm第134行

在浏览器中,我有:

无法在上调用方法“prepare” lib/Search.pm行中未定义的值 51

所以我知道脚本无法连接到数据库。但是为什么呢? 它正在开发mod_cgi。 如果有人有想法:'(
谢谢。

什么是Connexion,它在DBI connect呼叫中做什么


您很可能不需要禁用SetupEnv。

Connexion是我为连接数据库而设计的一个模块。它位于/cgi-bin/lib中,而我以前的脚本从/cgi-bin/目录调用它

包装连接

use strict;
use DBI;
sub database{

    my ($var,$var) = @_;
    my ($host1 ,$user1,$dbname1 ,$pass1)= '';

    if (($var== 1) and ($var ==1)){

        $host1              = 'localhost';
        $user1              = 'root';
        $dbname1            = 'BASE';
        $pass1              = '**';
     }

return my $fastdb = DBI -> connect ('DBI:mysql:' . $dbname1 . ':' . $host1, $user1, $pass1);
}
1;

缺少几行(大约120行)。还有,为什么不直接用DBI->connect返回,而不是设置一个变量呢?另外,您确定我的($host1,$user1,$dbname1,$pass1)=''正在做您想做的事?最后,您应该将RaiseError=>1添加到连接选项中,以便更早地获得错误通知。DBD::mysql的连接字符串不是类似于:“DBI::mysql:database=$dbname1;host=$host1”,而不是“DBI:mysql:$dbname1:$host1”?我的行和if行中重复的$var可能是打字错误(你为什么不直接复制和编辑)你没有在这里显示足够的代码来确定,但我认为问题与你在Connextion.pm第134行使用的密码有关。这就是这个错误告诉你的:
拒绝用户“www data”的localhost访问(使用密码:否)在lib/Connexion.pm第134行
no use warnings;,此处或Connexion中可能会发现重复的$var问题。此外,如其中一个答案所述,关闭开发中的SetupEnv会删除mod_cgi和mod_perl之间的一些兼容性
use strict;
use DBI;
sub database{

    my ($var,$var) = @_;
    my ($host1 ,$user1,$dbname1 ,$pass1)= '';

    if (($var== 1) and ($var ==1)){

        $host1              = 'localhost';
        $user1              = 'root';
        $dbname1            = 'BASE';
        $pass1              = '**';
     }

return my $fastdb = DBI -> connect ('DBI:mysql:' . $dbname1 . ':' . $host1, $user1, $pass1);
}
1;