Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当memory_limit设置为-1时,什么限制了PHP内存? 背景_Php_Out Of Memory - Fatal编程技术网

当memory_limit设置为-1时,什么限制了PHP内存? 背景

当memory_limit设置为-1时,什么限制了PHP内存? 背景,php,out-of-memory,Php,Out Of Memory,我理解如何使用PHP的设置来控制PHP可以使用多少内存 除了使用此属性提高/降低脚本的内存限制外,还可以将其设置为-1,以完全禁用内存限制 然而,正如我们所知,计算机没有,因此我们真正谈论的是消除PHP本身实现的任何自我强加的限制 例证 通过使用以下脚本,我们可以证明这是正确的: <?php print("Original: "); print(ini_get('memory_limit')); ini_set('memory_limit', -1);

我理解如何使用PHP的设置来控制PHP可以使用多少内存

除了使用此属性提高/降低脚本的内存限制外,还可以将其设置为
-1
,以完全禁用内存限制

然而,正如我们所知,计算机没有,因此我们真正谈论的是消除PHP本身实现的任何自我强加的限制

例证 通过使用以下脚本,我们可以证明这是正确的:

<?php

    print("Original: ");
    print(ini_get('memory_limit'));

    ini_set('memory_limit', -1);

    print(", New: ");
    print(ini_get('memory_limit'));

    $x = "123456789ABCDEF";
    while (true)
        $x .= $x;

?>

从命令行运行时,我得到以下输出:

原:128M,新:-1

PHP致命错误:第14行的test.PHP内存不足(已分配503840768)(试图分配1006632961字节)

致命错误:第14行的test.php内存不足(已分配503840768)(试图分配1006632961字节)

zend_mm_堆已损坏

从网络(通过Apache)我得到了类似的东西:

原:128M,新:-1

致命错误:第14行的test.php内存不足(已分配503840768)(试图分配1006632961字节)

在我的示例中,这些值是相同的(~480MB),因此web服务器似乎没有施加限制。此外,这与系统中安装的RAM数量相差甚远(甚至忽略虚拟内存),因此它不是硬件限制

请注意,这些测试是在PHP5.6上运行的,运行在内存为4GB的Windows机器上。然而,产出是有限的

最后,我们来问一个问题! 鉴于上述情况:

  • 当我们将内存限制设置为
    -1
    时,究竟是什么规定了内存限制
  • 有没有办法从PHP中找出这个限制

  • 当您将
    内存\u限制设置为
    -1
    时,实际限制是操作系统可用的内存

    可用内存是指物理内存(RAM)和虚拟内存(SWAP)的总和减去其他进程和操作系统本身当前使用的内存。 这是硬件限制,您还必须考虑其他进程。

    例如,给定4GB的RAM、无交换和其他占用3GB内存的进程(DB、WebBrowser等),PHP可以使用大约1GB的内存。当您尝试使用更多时,操作系统会拒绝内存分配请求,随后PHP会以“内存不足”错误退出


    没有可以跨不同操作系统使用的方法,PHP不提供检查环境中可用和使用的内存量的函数。如果您知道您的应用程序正在Linux上运行,您可以尝试从
    /proc/meminfo
    读取内存信息

    <?php
    echo file_get_contents("/proc/meminfo");
    

    基于此,您可以尝试估计可用内存的数量,请注意,其他进程使用的内存将随时间而变化。

    当您尝试分配总共1.5 GB而不是480 MB的内存时,您的内存将耗尽。可能机器上的其他服务(操作系统、数据库等)正在使用部分4GB。操作系统。@HappyDog我认为“操作系统需要一些RAM才能运行”不需要引用。我的问题遭到否决,但没有解释。如果我能做些什么来改进它,请在评论中告诉我。@HappyDog我犹豫是否说“可用RAM”,因为可能涉及交换配置
    MemTotal:        1999084 kB
    MemFree:          174344 kB
    MemAvailable:    1077264 kB
    Buffers:          151328 kB
    Cached:           726752 kB
    ...