php内存泄漏+内存限制memory_limit

↘锁芯ラ 提交于 2019-12-24 02:50:26

内存泄漏

内存泄漏指的是在程序运行过程中申请了内存,但是在使用完成后没有及时释放的现象, 对于普通运行时间较短的程序来说可能问题不会那么明显,但是对于长时间运行的程序, 比如Web服务器,后台进程等就比较明显了,随着系统运行占用的内存会持续上升, 可能会因为占用内存过高而崩溃,或被系统杀掉。

Nginx&PHP-FPM

这里先简单说一下nginx+php-fpm模式的工作原理:

  • nginx服务器fork出n个子进程(worker),php-fpm管理器fork出n个子进程。
  • 当有用户请求,nginx的一个worker接收请求,并将请求抛到socket中。
  • php-fpm空闲的子进程监听到socket中有请求,接收并处理请求。

第三步涉及到php-fpm进程生命周期的东西。

一个php-fpm的生命周期大致是这样的:

模块初始化(MINIT)

-> 模块激活(RINIT)

-> 请求处理

-> 模块停用(RSHUTDOWN)

-> 模块激活(RINIT)

-> 请求处理

-> 模块停用(RSHUTDOWN)

…….

-> 模块激活(RINIT)

-> 请求处理

-> 模块停用(RSHUTDOWN)

-> 模块关闭(MSHUTDOWN)。

在一个php-fpm进程的生命周期里,会有多次的模块激活(RINIT)-> 请求处理 -> 模块停用(RSHUTDOWN)的过程。

这个“请求处理”的大致过程是这样的:

php读取相应的php文件,对其进行词法分析,生成opcode,zend虚拟机执行opcode。

PHP配置文件里面的memory_limit 这个东西,其实,它限制的只是这个“请求处理”的内存。

所以,这个参数跟php-fpm进程占用的内存并没有什么关系。

php是用c写的,所以,难免又会一些内存泄露。也就是说,在“请求处理”这个过程结束后,有些变量没有被销毁,然后就导致一个php-fpm进程占用的内存越来越大。

那么,有什么办法能阻止这个问题呢? 
php-fpm.conf中有个参数pm.max_requests,等同于PHP_FCGI_MAX_REQUESTS。该值的意思是一个fpm进程处理多少个请求后自动杀掉另起新进程。 
这个参数默认是关闭的,我们需要开启这个参数,并且适当降低这个值,用以让php-fpm自动的释放内存。

另一个跟它有关联的值max_children,这个是每次php-fpm会建立多少个进程,这样实际上的内存消耗是max_children*max_requests*每个请求使用内存,根据这个我们可以预估一下内存的使用情况,就不用再写脚本去kill了。

内存限制memory_limit

function test1() {
    $str = 'Hello word!';
    for($i = 0; $i<50000000; $i++){
        $sv = 'str'.$i;
        $$sv = $str;
        //unset($$sv);
    }
}


 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!