• 技术文章 >后端开发 >PHP问题

    php什么情况内存泄露

    王林王林2019-09-20 11:53:18原创1912

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

    情况一、程序操作数据过大

    情景还原:一次性读取超过php可用内存上限的数据导致内存耗尽

    <?php
    ini_set('memory_limit', '128M');
    $string = str_pad('1', 128 * 1024 * 1024);

    解决办法:

    1、能用钱解决的问题都不是问题,如果程序要读大文件的机会不是很多,且上限可预期,那么通过 ini_set('memory_limit', '1G'); 来设置一个更大的值或者 memory_limit=-1。内存管够的话让程序一直跑也可以。

    2、如果程序需要考虑在小内存机器上也能正常使用,那就需要优化程序了。如下,代码复杂了很多。

    <?php
     //php7 以下版本通过 composer 引入 paragonie/random_compat ,为了方便来生成一个随机名称的临时文件 
    require "vendor/autoload.php";
     ini_set('memory_limit', '128M'); 
    //生成临时文件存放大字符串 
    $fileName = 'tmp'.bin2hex(random_bytes(5)).'.txt'; touch($fileName);
    
    for ( $i = 0; $i < 128; $i++ ) {    
        $string = str_pad('1', 1 * 1024 * 1024);
        file_put_contents($fileName, $string, FILE_APPEND); 
    } 
    $handle = fopen($fileName, "r"); 
    for ( $i = 0; $i <= filesize($fileName) / 1 * 1024 * 1024; $i++ ) {   //do something   
        $string = fread($handle, 1 * 1024 * 1024); 
    } 
    fclose($handle); 
    unlink($fileName);

    情况二程序操作大数据时产生拷贝

    情景还原:执行过程中对大变量进行了复制,导致内存不够用。

    <?php 
    ini_set("memory_limit",'1M'); 
    $string = str_pad('1', 1* 750 *1024); 
    $string2 = $string; 
    $string2 .= '1';

    解决办法:

    及早释放无用变量,或者以引用的形式操作原始数据。

    <?php 
    ini_set("memory_limit",'1M'); 
    $string = str_pad('1', 1* 750 *1024); 
    $string2 = $string; 
    unset($string); 
    $string2 .= '1';

    情况三、配置不合理系统资源耗尽

    情景还原:因配置不合理导致内存不够用,2G 内存机器上设置最大可以启动 100 个 php-fpm 子进程,但实际启动了 50 个 php-fpm 子进程后无法再启动更多进程。

    解决办法:

    合理设置 post_max_size、max_file_uploads、upload_max_filesize、max_input_vars、max_input_nesting_level 等参数并调优 php-fpm 相关参数。

    情况四、无用的数据未及时释放

    情景还原:这种问题从程序逻辑上不是问题,但是无用的数据大量占用内存导致资源不够用,应该有针对性的做代码优化。

    Laravel开发中用于监听数据库操作时有如下代码:

    DB::listen(function ($query) {            
    // query−>sql//query−>sql//query->bindings            
    // $query->time        });

    解决办法:

    本例中要通过DB::listen方法获取所有执行的 SQL 语句记录并写入日志,但此方法存在内存泄露问题,在开发环境下无所谓,在生产环境下则应停用,改用其他途径获取执行的 SQL 语句并写日志。

    推荐教程;PHP视频教程

    以上就是php什么情况内存泄露的详细内容,更多请关注php中文网其它相关文章!

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

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

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

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

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

    专题推荐:php 内存泄漏
    上一篇:php三目运算符怎么用 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• PHP内存泄漏详解• 内存泄漏是什么以及如何解决• 内存泄漏怎么解决• 定位分析内存泄漏的原因和后果
    1/1

    PHP中文网