• 技术文章 >后端开发 >php教程

    PHP内存泄漏详解

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

    PHP的内存泄漏

    PHP属于高级语言,语言级别并没有内存的概念,在使用过程中完全不需要主动申请或释放内存, 所以在PHP用户代码级别也就不存在内存泄漏的概念了。

    如果你的PHP程序内存泄漏了,要么是没有及时释放大变量、那么就是第三方扩展本身实现存在问题。

    PHP-FPM造成的内存泄漏

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

    php入门到就业线上直播课:进入学习

    1. nginx服务器fork出n个子进程(worker),php-fpm管理器fork出n个子进程。

    2. 当有用户请求,nginx的一个worker接收请求,并将请求抛到socket中。

    3. 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-fpm.conf中有个参数pm.max_requests,等同于PHP_FCGI_MAX_REQUESTS。该值的意思是一个fpm进程处理多少个请求后自动杀掉另起新进程。

    内存泄漏的debug及工具

    内存泄漏的程序通常很容易发现,因为症状都表现为内存占用的持续增长, 在发现内存持续增长后我们需要判断是什么导致了内存泄漏,这时往往需要 借助一些工具来帮助追查,我们可以用到两个工具:PHP内置内存泄漏探测 及valgrind内存泄漏分析。

    相关推荐:

    JavaScript内存泄漏的处理方式实例分享

    PHP内核-内存泄漏与新垃圾回收机制的图文介绍

    什么是内存泄漏以及内存泄漏发生的原因和防止办法

    以上就是PHP内存泄漏详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:php 详解 泄漏
    上一篇:PHP并发IO编程详解 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 工具包分享:PHP实现滑块验证图片• PHP中的SimpleXML处理_PHP教程• 通过PHP修改Linux或Unix口令的方法分享_PHP教程• PHP header函数分析详解_PHP教程• php学习笔记 面向对象的构造与析构方法_PHP教程
    1/1

    PHP中文网