Env:
Red Hat Enterprise Linux Server release 6.4
Apache/2.2.15 (Unix) mod_perl/2.0.4 Perl/v5.10.1
Perl v5.10.1 (*) built for x86_64-linux-thread-multi
64 bit Oracle client for 11.2
DBD::Oracle : Oracle Driver for DBI ; P/PY/PYTHIAN/DBD-Oracle-1.64.tar.gz : /usr/local/lib64/perl5/DBD/Oracle.pm : Installed: 1.64
/home/oracle/app/oracle/product/11.2.0/client_1/lib/libclntsh.so.11.1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
-rwxr-xr-x. 1 oracle oracle 48725761 Jun 10 17:41 /home/oracle/app/oracle/product/11.2.0/client_1/lib/libclntsh.so.11.1
Startup.pl
use lib qw(/home/oracle/app/oracle/product/11.2.0/client_1/lib);
BEGIN {
$ENV{ORACLE_HOME} = '/home/oracle/app/oracle/product/11.2.0/client_1';
$ENV{LD_LIBRARY_PATH} = '/home/oracle/app/oracle/product/11.2.0/client_1/lib';
$ENV{ORACLE_SID} = 'MARS';
}
print STDERR "nORACLE_HOME = " . $ENV{'ORACLE_HOME'} . "n";
print STDERR "nLD_LIBRARY_PATH = " . $ENV{'LD_LIBRARY_PATH'} . "n";
use mod_perl2;
use Apache::DBI ();
use DBI ();
use DBD::Oracle;
BEGIN { use Data::Dumper; print STDERR Dumper(@INC); }
print STDERR "ModPerl2 Startup.pln";
foreach ( keys %ENV ) {
print STDERR "$_t$ENV{$_}n";
}
1;
Apache conf
PerlRequire /var/www/cgi-bin/startup.pl
SetEnv ORACLE_HOME "/home/oracle/app/oracle/product/11.2.0/client_1"
SetEnv LD_LIBRARY_PATH "/home/oracle/app/oracle/product/11.2.0/client_1/lib"
错误:
Can't load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.11.1: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 200.n at /var/www/cgi-bin/startup.pl line 17nCompilation failed in require at /var/www/cgi-bin/startup.pl line 17.nBEGIN failed--compilation aborted at /var/www/cgi-bin/startup.pl line 17.nCompilation failed in require at (eval 2) line 1.n
Startup.pl 从命令行运行时工作,但无法通过 Apache 加载
已经尝试过的事情
- 在 Apache conf 中设置 env 变量(如上所示(
- 检查预言机库的文件性能
- 从命令行打印 env 变量并在从 Apache 运行时与输出进行比较(删除 DBD::Oracle 后(
- 确保所有Perl,Apache,Oracle,DBD:Oracle都是64位的。 将/home/oracle/
- app/oracle/product/11.2.0/client_1/lib 添加到/etc/ld.so.conf 并运行 ldconf
该错误来自Apache无法找到Oracle安装。 将 Oracle $PATH env vars 放入 bin/envvars 文件中,如下所示:
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# envvars-std - default environment variables for apachectl
#
# This file is generated from envvars-std.in
#
ORACLE_HOME="/home/oracle/app/oracle/product/11.2.0/client_1"
LD_LIBRARY_PATH="/home/oracle/app/oracle/product/11.2.0/client_1/lib"
export LD_LIBRARY_PATH ORACLE_HOME
您的DBD::Oracle
是针对 11.1 构建的,如错误消息所示,它正在寻找一个专门命名/版本化的 .so 文件("libclntsh.so.11.1"(。
但是,您的运行时配置为 11.2,如您的路径所示,并且不提供该特定命名/版本控制的 .so 文件。
为首选运行时配置重新生成DBD::Oracle
,然后从那里开始。
这很可能是一个 selinux 问题。如果您的脚本在 shell 上运行良好,但不能从 apache 运行,请尝试禁用 selinux。
如果它有帮助,你最好配置selinux,而不仅仅是禁用它。
在 RHEL(5、6 和 7(上出现相同的错误消息。这就是最终为我修复它的原因:
echo $ORACLE_HOME/lib >> /etc/ld.so.conf
/sbin/ldconfig
service httpd stop; service httpd start