为什么在 mod_perl 中加载我的 Perl 模块会导致 Apache 挂起?
我有一个 mod_perl 程序,它实现了自己的处理程序函数(即它不使用 Apache::Registry)。
我有一个使用 Parse::RecDescent 编写的解析器模块。
我已经在另一个类似的 mod_perl 程序中成功使用解析器模块几个月了,没有出现任何问题。
只需在我的新 mod_perl 程序中“使用”解析器模块(即不引用模块中的函数),就会导致 Apache 服务器生成子进程,直到达到最大限制。 注释掉“use”语句解决了问题(但显然,我没有使用解析器)。
我怀疑包含该库正在做一些导致 Apache 生命周期在结束之前挂起的事情。 我相信这是在日志记录阶段之后发生的,因为响应已发送且日志已更新。
有人有任何线索给我吗? 我不知所措。
--菲尔--
I have have a mod_perl program that implements its own handler function (i.e. it's not using Apache::Registry).
I have a parser module written using Parse::RecDescent.
I have been successfully using the parser module in another similar mod_perl program for months with no issue.
Simply "use"ing the parser module in the my new mod_perl program (i.e. no references to functions in the module) causes the Apache server to spawn child processes until it hits it's max limit. Commenting out the "use" statement solves the problem (but leaves me without the use of the parser, obviously).
I suspect that the inclusion of the library is doing something that causes the Apache lifecycle to hang before it ends. I believe this is happening after the logging phase since the response is sent and the log is updated.
Anyone have any clues for me? I'm at a loss.
--phil--
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我没有给你答案(就我个人而言,我使用 fastcgi...),但我可以建议一种方法:将 strace、ltrace、gdb 等附加到 apache 子进程并查看其挂起的位置。 您可能需要使用调试符号重建 apache、mod_perl 甚至 perl,才能从 gdb 获得合理的输出。
I don't have an answer for you (personally, I use fastcgi...) but I can suggest an approach: attach strace, ltrace, gdb, etc. to the apache child process and see where its hanging. You may need to rebuild apache, mod_perl, and even perl with debug symbols to get reasonable output from gdb.
所以,我解决了这个问题,但不明白为什么它有效。 这让我有点沮丧,但我很庆幸问题已经解决了。
在我接受 derobert 的建议并跟踪该过程之前,我决定将库加载移至 mod_perl 启动文件,瞧,问题解决了。
有趣的是,我花了一天的时间才达到足够理解问题的地步,从而可以提出有关 SO 的问题,然后一旦我到达这一点,一个简单的事情就解决了它。
So, I solved the problem, but don't understand why it worked. That leaves me slightly frustrated, but I'm grateful that the problem's gone.
Before I took derobert's suggestion and traced the process, I decided to move the library load to the mod_perl startup file and voila, problem solved.
Interesting that it took me a day of work to get to the point where I understood the problem enough to ask the question on SO and then once I got to that point, a simple thing solved it.