保持在mod_perl下加载perl XSUB SharedObject

时间:2011-11-10 22:48:17

标签: perl mod-perl

我为一个非常简单的C API编写了一个perl XSUB包装器(我没有源代码)。

C API由4个函数组成。其中一个返回一个“句柄”(只是一个int),这个值必须传递回任何其他3个函数,以获得正确的内部“对象”来调用。假设C API保留了这些对象的列表,并为提供的句柄抛出正确的对象。

在独立脚本中运行时,一切都很好。

我现在正尝试使用mod_perl在apache2下运行此API。最初,一切正常 - 我将“句柄”返回给客户端,然后客户端使用相同的句柄值进行后续调用。但是,在(非常短暂的)不活动时段之后,C API决定它丢失了它的“对象”列表并重新开始。

我认为这是因为正在卸载底层的.so文件。

所以,我的问题:

我有什么办法可以防止apache / perl卸载这个.SO吗?唯一可行的方法是使用-X在调试模式下运行apache。

由于

2 个答案:

答案 0 :(得分:2)

我认为这是因为正在卸载基础.so文件。

不,这是因为一个不同的apache子获取HTTP请求,并且它对其他子节点一无所知

http://perl.apache.org/docs/1.0/guide/porting.html

的基本详情

答案 1 :(得分:0)

我认为问题在于SO必须为第一个请求进行大量初始化,并且您希望避免重复这样做。

如果您调整MPM设置,可能会有所帮助。

根据MPM文档,您可以通过设置适当的指令来避免子进程被终止和重新启动。

  

除了活动子进程集之外,还可能有其他子进程正在终止,但至少有一个服务器线程仍在处理现有客户端连接。尽管可以预期实际数量可以小得多,但是可以存在最多MaxClients终止过程。通过禁用单个子进程的终止可以避免此行为,这可通过以下方式实现:

     
      
  • MaxRequestsPerChild的值设为零

  •   
  • MaxSpareThreads的值设置为与MaxClients相同的值

  •   

这意味着关闭了调节子进程生命周期的两种机制。首先,进程在MaxRequestsPerChild之后自动终止并重新启动。将其设置为零会禁用此功能。其次,如果有多个MaxSpareThreads闲置,可以剔除子进程以节省服务器资源。第二个指令禁用该过程。