【问题标题】:ModPerl::RegistryPrefork should make my old cgi work butModPerl::RegistryPrefork 应该让我的旧 cgi 工作但是
【发布时间】:2011-06-20 20:26:27
【问题描述】:

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

我已经安装了 mod-perl2 并像这样配置我的 VirualHost:

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>

我的脚本看起来像 .他在 /v6/cgi-bin/lib/ 中使用了一些模块

#!/usr/bin/perl 

    use lib qw(lib);
    use strict;
    use DBI;
    use CGI;
    use Template;
    use CGI::Carp qw(fatalsToBrowser);
    use Data::Dumper;

    use Connexion;
    use Search;

    my $cgi     = new CGI;

    our $fastdb = Connexion::database('1','1');
    my $get_description__id_sth  = Search->get_description_id_sth();

Apache2 将错误写入日志:

[2011 年 2 月 3 日星期四 17:35:13] -e: DBI 连接(':','',...)失败:访问 拒绝用户 'www-data'@'localhost' (使用密码:NO)在 lib/Connexion.pm 第 134 行

在我的浏览器中:

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

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

【问题讨论】:

  • no use warnings;,在这里或在 Connexion 中会发现重复的 $var 问题
  • 另外,正如其中一个答案所述,在 PerlOptions 中关闭 SetupEnv 会删除 mod_cgi 和 mod_perl 之间的一些兼容性

标签: perl web-applications cgi mod-perl2


【解决方案1】:

什么是 Connexion 以及它在 DBI 连接调用中的作用?

您很可能不需要禁用 SetupEnv。

【讨论】:

    【解决方案2】:

    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 而不是设置变量呢?另外,你确定 my ($host1, $user1, $dbname1, $pass1) = '' 正在做你想做的事吗?最后,您应该将 RaiseError => 1 添加到连接选项中,以便更早地了解错误。
    • 也不是 DBD::mysql 的连接字符串类似于:"DBI::mysql:database=$dbname1;host=$host1",而不是 "DBI:mysql:$dbname1:$host1"?大概 my 行和 if 行中重复的 $var 是拼写错误(你为什么不直接复制和粘贴)
    • 您确实没有在这里显示足够的代码来确定,但我认为问题与您在 Connextion.pm 第 134 行使用的密码有关。这就是这个错误的原因告诉你:Access denied for user 'www-data'@'localhost' (using password: NO) at lib/Connexion.pm line 134
    猜你喜欢
    • 2021-12-17
    • 2017-01-06
    • 1970-01-01
    • 2014-10-30
    • 2012-01-07
    • 1970-01-01
    • 2013-05-08
    • 2012-08-22
    • 2011-06-07
    相关资源
    最近更新 更多