php不严谨引起内存泄漏解决办法

php某一些脚本存在内存泄露的代码段。而apache处理这些代码段的进程的处理请求数被设置为无穷。也就是说这些进程只有在apache重启(stop-start模式)或者服务器重启的情况下才会被kill,否则将一直运行下去,直到耗尽系统的最后一点资源(主要是内存)。
下面给出基本的解决办法,(centos 7原生安装的httpd(apache))修改apache配置文件加上以下文件

  • mpm_worker模块配置(下述为2Gb内存)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    LoadModule mpm_worker_module modules/mod_mpm_worker.so
    <IfModule mpm_worker_module>
    #服务器允许配置的进程数上限
    ServerLimit 1500
    #设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。
    StartServers 5
    #MinSpareServers:设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers,那么Apache将以最大每秒一个的速度产生新的子进程。
    MinSpareServers 5
    #设置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。
    MaxSpareServers 10
    #用于客户端请求的最大接入请求数量(最大线程数)。
    MaxClients 1500
    #设置每个子进程在其生存期内允许提供的最大请求数量
    MaxRequestsPerChild 50
    </IfModule>
  • mpm_prefork模块配置(下述1GB内存)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

    <IfModule mpm_prefork_module>
    StartServers 5
    MinSpareServers 5
    MaxSpareServers 25
    MaxRequestWorkers 300
    ServerLimit 750
    MaxConnectionsPerChild 50
    </IfModule>

这样限制之后基本上就不会出现问题了。

感谢老板!