PHP内存\u获取\u使用情况
我遇到了PHP的PHP内存\u获取\u使用情况,php,memory,resources,Php,Memory,Resources,我遇到了PHP的memory\u get\u usage()和memory\u get\u peak\u usage() 问题是,我发现这两个函数没有提供当前脚本使用的实际内存。 我的测试脚本是: <?php echo memory_get_usage(); echo '<br />'; $a = str_repeat('hello', 100000); echo '<br />'; echo memory_get_usage(); echo '<
memory\u get\u usage()
和memory\u get\u peak\u usage()
问题是,我发现这两个函数没有提供当前脚本使用的实际内存。
我的测试脚本是:
<?php
echo memory_get_usage();
echo '<br />';
$a = str_repeat('hello', 100000);
echo '<br />';
echo memory_get_usage();
echo '<br />';
echo memory_get_peak_usage();
?>
其中:
1) 5355216-355120=5000096字节
2) 5356008-355120=5000888字节
如果是这样,我假设第一个
355120
字节是apache和其他模块使用的整个系统分配内存,因为当您增加或减少str_repeat()
中的重复次数时,第一个值不会改变,只有进程后的两个值会增加或减少,但不会小于第一个值。根据php手册,memory\u get\u usage返回分配给php的内存量,而不一定是正在使用的内存量。好的,您第一次断言第一个memory\u get\u usage()应该为0是错误的。根据PHP的文档:
返回内存量,单位为
字节,当前正在进行
分配给您的PHP脚本
您的脚本正在运行,因此必须为其分配一些内存。第一个电话会告诉你这是多少钱
你的第二个断言str_repeat()不应该使用那么多内存,这并不是从整体来看的
字符串“hello”(使用5个字节)重复了100000次,总计500000字节…最小值。问题是,PHP是如何执行此操作的?他们使用过这样的代码吗?(伪代码):
s=“”
对于(i=0;i在我的例子中(Mac OS X 10.5上的PHP 5.3.3),您的脚本打印:
323964
824176
824980
现在,第二个度量值和第一个度量值之间的差值为500212,非常接近“hello”(5)乘以100000的长度。所以我在这里说,这并不奇怪。峰值更大,因为在评估这些语句时会进行一些临时分配
(您的其他问题已得到回答)那么,我必须从执行脚本后分配的第二个内存量中减去脚本之前分配的第一个内存量吗?就像我在问题中演示的获取用于运行当前脚本的实际内存的示例一样?@mohamed87,否。这是您的脚本正在使用的内存量。PHP interpreter使用内存,因此会添加到脚本的内存中感谢您的回复。但问题是我想监控我的php脚本的内存使用情况,这样我就不会在共享主机上过度消耗资源。@mohamed87,我无法再清楚地解释它了。在查看内存使用情况时,您必须查看正在使用的内存。@mohamed87你也需要翻译。看看大局。记忆给你的数字是正确的数字。非常有趣。您的实现中的PHP代码似乎比问题作者的代码更有效。非常有趣…在我的PHP5.3.3中,它给出了与预期几乎完全不同的500000(请参阅本线程中我的答案)@事实上,不同版本/编译的PHP之间似乎存在巨大差异。非常有趣。
memory_usage = the second memory usage - the first memory usage
peak_memory_usage = the third (peak_usage) - the first memory usage
s = ""
for(i=0; i<100000; i++)
s += "hello"