为啥我的 Perl CGI 脚本找不到 Oracle DBD?

Posted

技术标签:

【中文标题】为啥我的 Perl CGI 脚本找不到 Oracle DBD?【英文标题】:Why can't my Perl CGI script find the Oracle DBD?为什么我的 Perl CGI 脚本找不到 Oracle DBD? 【发布时间】:2008-11-16 22:07:33 【问题描述】:

DBD 和 Oracle 大师:

我有一个行为异常的 Perl Web 应用程序。我正在使用它从 Oracle DB 中读取一些内容并进行报告。我安装了 11.1.0.6.0 版的 Oracle Instant Client。我在 WinXP 上运行并将 PATH 环境变量设置为即时客户端位置。我的网络服务器有 Apache2。

问题是:当我从命令行运行应用程序时,它可以顺利运行。但是,当我从http://127.0.0.1/cgi-bin/a.cgi 运行时,我收到以下数据库访问错误:

install_driver(Oracle) failed: Can't load 'C:/usr/lib/auto/DBD/Oracle/Oracle.dll' for module DBD::Oracle: load_file:The specified module could not be found at C:/usr/lib/DynaLoader.pm line 202. at (eval 9) line 3

直觉告诉我这是一个权限问题,但我不知道该往哪里看。任何人都可以对此有所了解吗?非常感谢任何帮助。

谢谢, 猎犬加尼

【问题讨论】:

能否提供错误信息中提到的调用代码? Apache的错误日志有错误吗? 【参考方案1】:

错误显示 .DLL 的完整路径这一事实表明系统在查找 DLL 时没有任何问题,因此这确实支持了您的理论,即文件权限是问题所在。

要测试它是否真的是权限问题,请尝试编写一个简单的 Perl CGI 脚本,该脚本除了直接打开特定的 .DLL 文件(使用普通的 open 调用)并报告它是否工作外,什么都不做。

【讨论】:

【参考方案2】:

感谢阿尔尼塔克。我尝试按照您的建议进行操作,并且“打开”成功打开了“C:/usr/lib/auto/DBD/Oracle/Oracle.dll”。我记得当我在另一台机器上开发时看到了这个确切的错误,但那是因为 Oracle Instant Client 库在它上面丢失了。在我安装这些并设置“路径”变量后,一切都开始正常工作了。

【讨论】:

【参考方案3】:

我遇到了同样的问题,通过接口访问 cgi perl 程序时报告错误“Install_driver(Oracle) failed: Can't load 'C:/Perl/lib/auto/DBD/Oracle/Oracle. dll' 用于模块 DBD::Oracle: load_file:Access is denied at C:/Perl/lib/DynaLoader.pm line 201"。

我在带有 IIS 6 的 Window 2003 Server 上使用 Perl 5.10。

解决方案是将 Perl 目录的权限授予“所有人”以及 Oracle 安装文件夹。

【讨论】:

以上是关于为啥我的 Perl CGI 脚本找不到 Oracle DBD?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Perl 在 ClearCase 中找不到我的文件?

我用 CPAN 成功安装了一个模块,但是 perl 找不到它。为啥?

为啥 Perl CGI 模块使用连字符来开始命名参数?

为啥 Perl v5.22 找不到所有的句子边界?

从 Perl 5.14 升级到 5.28 后,我的 Perl 找不到 local::lib

Perl cgi 脚本无法读取与其父目录具有相同权限的目录