当memory_limit设置为-1时,什么限制了PHP内存? 背景
我理解如何使用PHP的设置来控制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);
-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
时,究竟是什么规定了内存限制当您将
内存\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
...