环境:Apache / 2.2.11(Win32)mod_apreq2-20051231 / 2.6.2-dev mod_perl / 2.0.4-dev Perl / v5.10.0
与this discussion list post中描述的情况非常相似,除了在win32上。
我在httpd.conf中有这个:
PerlModule Apache2::Reload
PerlInitHandler Apache2::Reload
PerlSetVar ReloadAll Off
PerlSetVar ReloadModules "MyPackage::*"
...以及只有mod-perl脚本处理。
我有一个使用MyPackage模块的脚本,它正在运行。
我打破了模块,然后重新加载脚本。错误是一个有用的错误,告诉我打破模块的位置。
(如果我此时再次重新加载,它只告诉我“Undefined subroutine& ModPerl :: ROOT :: ModPerl :: Registry ...”,因为它无法第一次加载文件。但无论哪种方式,仍然会发生以下行为。)
我恢复中断,并触摸脚本文件,以便重新加载模块,然后重新加载。现在它说:
Attempt to reload MyPackage/Foo.pm aborted.
Compilation failed in require at E:/dev/test.pl line 4.
即使我触摸脚本和模块,除非重新启动Web服务器,否则我无法正确重新加载。
打破脚本本身(而不是模块)可以正常工作:正确的错误并将其更改回来会导致重新加载时再次运行。
在完成上述每项操作后,我在测试之前重新启动了Web服务器:
我已经尝试过追踪,但是 它继续出错的一行 on是ModPerl / RegistryCooker.pm行 204,这就是那条线 eval {}是整个剧本。
我尝试过更改“使用警告” 致命=> '全部'“只是”使用 警告“在剧本和 模块。没有什么区别。
我已尝试停用自定义 $ SIG {__ DIE__}函数。没有 做出改变。 (好吧,只有 当然,错误出现在哪里 但产生的错误是 相同。)
根据开头的讨论链接,发现MaxRequestsPerChild一直都是0,我尝试过ThreadsPerChild 1,但没有区别。我尝试将MaxRequestsPerChild设置为1,这解决了此问题的奇怪行为,但在每次请求后重新启动Web服务器:
Child 7072: Process exiting because it reached MaxRequestsPerChild. Signaling the parent to restart a new child process.
Parent: Received restart signal -- Restarting the server.
这不是一个好的解决方案,因为我有一大堆代码在第一次点击页面时运行。
同样根据讨论,我将httpd作为服务运行,因此我在服务参数窗口中添加-X并点击“开始”,它仍然尝试在三分钟后启动完整(通常在3秒内启动) 。)甚至收到超时消息。通过任务管理器杀死进程并验证我无法通过Web浏览器访问该页面。从命令行启动httpd -X。仍然与此问题顶部的行为相同。另外,当我运行httpd时,我发现-X没有列出奇怪 - ?也许它在win32 MPM上不可用?
在那篇帖子中,大卫指出:
我对此进行排查的经验 有点问题表明了它的问题 可能是那个包 卸载删除了存储在中的值 重新加载模块的包空间 (可能设置在BEGIN块时间) 随后的要求没有 还原
但我的代码并非如此。我引入的“打破脚本”错误只是在已经存在的那个上面添加了一个额外的'my $ var'行,所以第二行会抱怨它已经被声明了。
如果没有在每次重新加载后重新启动Web服务器(没有自动,通过MaxRequestsPerChild,或者像以前那样手动重启),是否无法处理mod_perl2模块?
答案 0 :(得分:2)
将sub复制到您正在调用它的脚本,并将此代码放在副本之前:
package MyPackage::Foo;
no warnings 'redefine';
完成更改后,将子设备移回实际模块。