【问题标题】:Perl module not found when script executed by phpphp执行脚本时找不到Perl模块
【发布时间】:2013-04-24 21:41:41
【问题描述】:

我通过 php 使用 exec 执行 perl 脚本,但是我收到一个错误,指出模块 Net::DNS 丢失。我以普通用户的身份安装了该模块,因此位于 /home/user/perl5/i686-linux-thread-multi 中,我在 exec 中使用了完整路径 (/usr/bin/perl)。

我什至尝试将 /home/user/perl5/i686-linux-thread-multi 目录添加到 @INC 但脚本仍然抛出错误...

我还尝试将具有自定义安装路径的模块直接安装到 /usr/lib/perl5/vendor_perl,但这也没有解决问题。 符号链接也没有解决这个问题。

这是错误信息

  Can't locate Net/DNS.pm in @INC (@INC contains: 
/usr/lib/perl5/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl 
/usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl

知道如何解决这个问题,有点想不出如何处理这个问题。

【问题讨论】:

    标签: php perl module exec


    【解决方案1】:

    exec之前,添加:

    $ENV{PERL5LIB} = "$ENV{PERL5LIB}:/home/user/perl5/i686-linux-thread-multi";
    

    为什么使用use lib 不起作用(对于帕维尔的评论):

    #!/usr/bin/env perl
    use strict;
    use warnings;
    use lib "hate_you";
    use Data::Dumper;
    
    print Dumper(\@INC);
    
    print "In sub process....\n";
    exec(qq{perl -MData::Dumper -e "print Dumper(\@INC);"});
    

    将在我的机器上打印:

    $VAR1 = [
              'hate_you',
              '/etc/perl',
              '/usr/local/lib/perl/5.14.2',
              '/usr/local/share/perl/5.14.2',
              '/usr/lib/perl5',
              '/usr/share/perl5',
              '/usr/lib/perl/5.14',
              '/usr/share/perl/5.14',
              '/usr/local/lib/site_perl',
              '.'
            ];
    In sub process....
    
        $VAR1 = '/etc/perl';
        $VAR2 = '/usr/local/lib/perl/5.14.2';
        $VAR3 = '/usr/local/share/perl/5.14.2';
        $VAR4 = '/usr/lib/perl5';
        $VAR5 = '/usr/share/perl5';
        $VAR6 = '/usr/lib/perl/5.14';
        $VAR7 = '/usr/share/perl/5.14';
        $VAR8 = '/usr/local/lib/site_perl';
        $VAR9 = '.';
    

    【讨论】:

    • 这里指的是perl的exec,我相信php中也有类似的env
    【解决方案2】:

    另一种方法是将您的个人库包含在您的脚本中,这样它就独立于环境集:

    use lib qw(/home/user/perl5/i686-linux-thread-multi);
    
    use Net::DNS;
    

    【讨论】:

    • 我怀疑这会起作用,使用 lib 修改当前进程中的 @INC 而不是从当前进程中产生的其他(如 exec)。
    • 为什么在你exec的Perl程序中使用它时不起作用?从来没有遇到过问题......
    猜你喜欢
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2018-09-07
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多