V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ligthdawn
V2EX  ›  问与答

为什么 PHP 脚本运行的内存限制最小是 2M 呢? memory_limit 参数已经设置为 1M

  •  
  •   ligthdawn · 2020-05-11 10:51:39 +08:00 · 983 次点击
    这是一个创建于 1451 天前的主题,其中的信息可能已经有所发展或是发生改变。

    附上脚本

    <?php
    
    ini_set('memory_limit', '1M');
    file_get_contents("/data/www/elasticsearch-7.4.2-linux-x86_64.tar.gz");
    

    读取的文件 elasticsearch-7.4.2-linux-x86_64.tar.gz 200 多 M

    报错信息如下 PHP Fatal error: Allowed memory size of 2097152 bytes exhausted (tried to allocate 288783720 bytes)

    疑问,为什么设置了脚本运行的内存限制为 1M,但是报错信息是显示 2M 呢

    4 条回复    2020-05-12 10:14:48 +08:00
    CodeCodeStudy
        1
    CodeCodeStudy  
       2020-05-11 17:34:47 +08:00
    PHP 采取“预分配方案”,提前向操作系统申请一个 chunk ( 2M,利用到 hugepage 特性),并且将这 2M 内存切割为不同规格(大小)的若干内存块,当程序申请内存时,直接查找现有的空闲内存块即可

    https://segmentfault.com/a/1190000014764790
    CodeCodeStudy
        2
    CodeCodeStudy  
       2020-05-11 18:18:00 +08:00
    https://github.com/php/php-src/blob/master/Zend/zend_alloc.c#L2660

    ZEND_API int zend_set_memory_limit(size_t memory_limit)
    {
    #if ZEND_MM_LIMIT
    AG(mm_heap)->limit = (memory_limit >= ZEND_MM_CHUNK_SIZE) ? memory_limit : ZEND_MM_CHUNK_SIZE;
    #endif
    return SUCCESS;
    }

    说明 memory_limit 是有最小值限制的
    CodeCodeStudy
        3
    CodeCodeStudy  
       2020-05-11 18:24:23 +08:00   ❤️ 1
    https://github.com/php/php-src/blob/master/Zend/zend_alloc_sizes.h#L22

    #define ZEND_MM_CHUNK_SIZE (2 * 1024 * 1024) /* 2 MB */
    ligthdawn
        4
    ligthdawn  
    OP
       2020-05-12 10:14:48 +08:00
    @CodeCodeStudy 谢谢老哥,今天早上刚刚找到类似的文章 https://blog.csdn.net/IT_10/article/details/94768679
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2191 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:39 · PVG 18:39 · LAX 03:39 · JFK 06:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.