在mod_perl下加载perl XSUB SharedObject

在mod_perl下加载perl XSUB SharedObject,perl,mod-perl,Perl,Mod Perl,我已经为一个非常简单的C API编写了一个perl XSUB包装器(我没有源代码) C API由4个函数组成。其中一个函数返回一个“句柄”(只是一个int),这个值必须传递回其他3个函数中的任何一个,以获得要调用的正确内部“对象”。我们假设C API保存了这些对象的列表,并为所提供的句柄抛出正确的对象 在独立脚本中运行时,一切都很好 我现在正试图用mod_perl在apache2下运行这个API。最初,一切正常-我将“句柄”返回给客户机,然后客户机使用相同的句柄值进行后续调用。但是,在一段(非常

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

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

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

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

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

所以,我的问题是:

我能做些什么来阻止apache/perl卸载它呢?唯一有效的方法是使用-X在调试模式下运行apache

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

不,这是因为另一个apache子级得到了HTTP请求,而它对其他子级一无所知


基本细节在

我假设问题在于SO必须对第一个请求进行大量初始化,并且您希望避免重复执行此操作

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

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

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

  • MaxRequestsParchild
    的值设置为零

  • MaxSpareThreads
    的值设置为与
    MaxClients


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

谢谢。我希望使用apacheworker线程mpm而不是fork来避免这个问题,但这似乎也能做到同样的事情吗?