php - memory_get_peak_usage() 与 "real usage"

标签 php memory memory-management

如果 real_usage 参数设置为 true,PHP DOCS 说它将获得系统分配的实际内存大小。如果是false会得到emalloc()

报告的内存

这两个选项中的哪一个返回最大值。相对于 php.ini 中的内存限制值分配的内存?

我想知道脚本有多接近该限制。

最佳答案

好的,让我们用一个简单的脚本来测试一下:

ini_set('memory_limit', '1M');
$x = '';
while(true) {
  echo "not real: ".(memory_get_peak_usage(false)/1024/1024)." MiB\n";
  echo "real: ".(memory_get_peak_usage(true)/1024/1024)." MiB\n\n";
  $x .= str_repeat(' ', 1024*25); //store 25kb more to string
}

输出:

not real: 0.73469543457031 MiB
real: 0.75 MiB

not real: 0.75910949707031 MiB
real: 1 MiB

...

not real: 0.95442199707031 MiB
real: 1 MiB

not real: 0.97883605957031 MiB
real: 1 MiB

PHP Fatal error:  Allowed memory size of 1048576 bytes exhausted (tried to allocate 793601 bytes) in /home/niko/test.php on line 7

似乎真正的使用是从系统分配的内存 - 这似乎分配在比脚本当前需要的更大的存储桶中。 (我猜是出于性能原因)。这也是php进程使用的内存。

$real_usage = false 使用量是您在脚本中实际使用的内存使用量,而不是 Zend 内存管理器分配的实际内存量。

阅读 this question了解更多信息。

简而言之:要了解您离内存限制有多近,请使用 $real_usage = true

关于php - memory_get_peak_usage() 与 "real usage",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15745385/

相关文章:

go - 最简单的 Go 竞争条件示例?

c - 除了 linux 中的 buddy allocator 之外,是否有不同的内存分配路径?

c++ - 对 C 指针使用 std::bad_alloc

c++ - 存储在 vector 中的对象的所有权

c - 无效读取 - Valgrind 和 C

php - CakePHP 管理部分路由和重定向

php - 用户认证和权限表结构

c - 不用 Malloc 动态分配内存

php - 无法创建表 MySQLi

php - Laravel 5.5 组中间件重定向你太多次