【问题标题】:How to find memory used by an object in PHP? (sizeof)如何在 PHP 中查找对象使用的内存? (大小)
【发布时间】:2010-11-07 16:57:25
【问题描述】:

如何在 PHP 中查找对象使用的内存? (c 的 sizeof)。我想查找的对象是一个包含字符串和整数的字典,因此很难手动计算。 php中的字符串也可以根据编码(utf8等)的不同长度正确吗?

【问题讨论】:

    标签: php memory memory-management


    【解决方案1】:

    你可以使用memory_get_usage()

    在创建对象之前运行一次,然后在创建对象后再次运行,并获取两个结果之间的差异。

    【讨论】:

    • 在内存中执行此操作的另一种方法是获取内存使用情况、克隆对象、获取新的内存使用情况并取消设置克隆。虽然有足迹,所以不要滥用...... :)
    • 我相信我们从数组前后的echo memory_get_usage()得到的结果,它的单位假设在KB!!!我将内存大小除以 1024!获取实际消耗的内存大小。
    • 是吗?那么,如果 PHP 在调用第二个 memory_get_usage 之前决定使用内存怎么办?...非常脆弱的解决方案...。
    • 这种对象克隆原则可能不适用于较小的对象。当我进行一些测试时,我的 PHP 似乎只以 256 KB 的块获取新的 RAM,或者至少这是我从 memory_get_usage() 收到的。因此,如果您的对象为 20KB,则需要创建 cca。其中 10 个,只是为了让 memory_get_usage() 发生变化。
    • 这个答案已经在多个问题上被揭穿了,因为 memory_get_usage() 获取整个 PHP 脚本的已用内存并且没有分离诸如开销之类的东西,因此比较它的结果不会给你对象。
    【解决方案2】:

    要了解对象大小,请尝试

    strlen(serialize($object));
    

    这绝不是准确的,而是一种获取数字进行比较的简单方法。

    【讨论】:

    • 这可能有一些用途,但不是为了记忆。 PHP
    • 我在发送它之前使用它来检查 json 响应,但它实际上耗尽了我的内存限制
    • 这将以字节为单位给出大小还是什么?
    【解决方案3】:

    如果需要知道已经创建的对象或数组的大小,可以使用下面的代码来查找。

    <?php
    
    function rec_copy($src) {
      if (is_string($src)) {
        return str_replace('SOME_NEVER_OCCURING_VALUE_145645645734534523', 'XYZ', $src);
      }
    
      if (is_numeric($src)) {
        return ($src + 0);
      }
    
      if (is_bool($src)) {
        return ($src?TRUE:FALSE);
      }
      if (is_null($src)) {
        return NULL;
      }
    
      if (is_object($src)) {
        $new = (object) array();
        foreach ($src as $key => $val) {
          $new->$key = rec_copy($val);
        }
        return $new;
      }
    
      if (!is_array($src)) {
        print_r(gettype($src) . "\n");
        return $src;
      }
    
      $new = array();
    
      foreach ($src as $key => $val) {
        $new[$key] = rec_copy($val);
      }
      return $new;
    }
    
    $old = memory_get_usage();
    $dummy = rec_copy($src);
    $mem = memory_get_usage();
    
    $size = abs($mem - $old);
    ?>
    

    这实际上创建了数组结构的副本它的所有成员。

    一个不是 100% 准确但仍然有效的版本也是:

    <?php
    
    $old = memory_get_usage();
    $dummy = unserialize(serialize($src));
    $mem = memory_get_usage();
    
    $size = abs($mem - $old);
    

    希望对已经构建对象的情况有所帮助。

    【讨论】:

    • 如果你想检测哪个是占用系统内存超过限制的对象,即使在过载之前临时使用的内存量会推动系统,你的进程也会加倍
    【解决方案4】:

    此方法将数组转换为 json 字符串并确定该字符串的长度。结果应该与数组的大小非常相似(两者都有分隔符来分隔数组的成员或字符串化的 json) strlen(json_encode(YourArray))

    【讨论】:

      【解决方案5】:

      这个方法可以帮到你:

      function getVariableUsage($var) {
       $total_memory = memory_get_usage();
       $tmp = unserialize(serialize($var));
       return memory_get_usage() - $total_memory; 
      }
      
      $var = "Hey, what's you doing?";
      echo getVariableUsage($var);
      

      https://www.phpflow.com/

      【讨论】:

      • 如果你想检测哪个是占用系统内存超过限制的对象,即使在过载之前临时使用的内存量会推动系统,你的进程也会加倍
      【解决方案6】:

      我不知道有没有一种简单的方法可以在 PHP 中获取对象的大小。你可能只需要做一个算法

      1. 对整数进行计数
      2. 将整数数乘以硬盘上整数的大小
      3. 将字符串中的字符转换为 ASCII 和
      4. 将 ASCII 值乘以它们在磁盘上的占用量

      我确信有更好的方法,但这会奏效,即使会很痛苦。

      【讨论】:

      • 你忘了等到 4 月 1 日才发这个朋友!
      • 我不认为他是认真的:)
      • 没有那么疯狂的想法。我认为彼得所说的可以变成功能性的东西……可能是一个递归函数,它将逐渐深入到对象中并收集并汇总所有变量的大小。可能对调试有用....
      • 远非疯狂或玩笑,但除非彻底和正确地完成,否则仍然非常不精确。无论如何,它可以很容易地让你很好地了解什么是最消耗你的 RAM(如果某个 var 消耗了 40% 或更多的 RAM - 你会注意到它)
      猜你喜欢
      • 2010-11-24
      • 2012-09-29
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      相关资源
      最近更新 更多