我们正在将旧的 Perl/CGI 应用程序内部迁移到新系统,但遇到了问题。当我运行:
perl -MXML::Parser -e 1
从命令行来看,一切都很好。然而,当我从 CGI 脚本中运行它时use XML::Parser
,一切都变得一团糟:
无法为模块 XML::Parser::Expat 加载“C:/strawberry/perl/site/lib/auto/XML/Parser/Expat/Expat.dll”:load_file:在 C:/strawberry/perl/lib/DynaLoader.pm 第 200 行,第 55 行找不到指定的模块。在 C:/strawberry/perl/site/lib/XML/Parser.pm 第 18 行,在 C:/strawberry/perl/site/lib/XML/Parser.pm 第 18 行,第 55 行,require 中编译失败。BEGIN 失败 - 编译在 C:/strawberry/perl/site/lib/XML/Parser.pm 第 22 行,第 55 行中止。在 (eval 43) 第 1 行,第 55 行,require 中编译失败。BEGIN 失败 - 编译在 (eval 43) 第 1 行,第 55 行中止。
添加到 perl 安装上的其他模块工作正常(MD5、WIn32::ODBC 等...)但这个 Expat 模块却出现问题。
该服务器是 IIS 7(对于我们这个应用程序来说是新的),x64 Win2008(对于我们来说也是新的)。
编辑:
经过一段时间的折腾,我发现这并不是唯一一个无法加载的模块。XML::Simple 也一样。几乎是同样的错误。Perl 声称不存在的 DLL 却存在得很好。而且从命令行也可以正常工作。
有什么建议吗?
答案1
Windows 版 Perl 发行版的 Cwd.pm 中有一个错误。请参阅https://rt.cpan.org/Public/Bug/Display.html?id=56225了解详情。
对我有用的修复方法是替换此行:
if (eval 'defined &DynaLoader::boot_DynaLoader') {
和
if (eval { defined &DynaLoader::boot_DynaLoader; }) {
在sub _win32_cwd
我还在这里找到了更多相关信息:www.epic-ide.org/faq.php#debug
答案2
抱歉,我自己回答了这个问题,但是我偶然发现了这一点......
经过几个小时的摸索,问题出在 IIS 应用程序池设置上。如果您加载用户配置文件设置错误的然后 PerlDynaloader
本身就会崩溃,什么都不起作用——而且没有特别有用的消息。我不知道哪个是默认值,但是如果默认值为 false 则会导致一切失败。
现在一切运行良好,以下是应用程序池中的设置:
32 位:已启用用户:应用程序池加载用户配置文件:True
我尝试让 CGI 程序以真实用户身份运行(我在命令行中使用的用户),并注意到即使我设置了正确的用户,我也没有获得我想要的环境,从而发现了这一点。拨动此开关使一切正常。最终我回到使用应用程序池,但确认这个开关是原因。