【问题标题】:PHP Memory Overflow?PHP内存溢出?
【发布时间】:2009-12-18 21:10:05
【问题描述】:

我目前正在构建一个 php 框架......再次。

我有一个名为 config 的类。

它很简单,它的名字是这样的:

$conf = config::get('general');

$conf 现在是一个包含配置好东西的数组。

类sceleton是这样的:

final class config {

private static $configs = array();

public static function get($name) {

return self::$configs[$name];

}

}

假设 $configs 数组已经被填充并且有一个“通用”键。

这个“通用”键包含一个正好为 1 兆字节的数组。

假设我打电话

config::get('general');

10 次转换成不同的变量。之后没有任何变量被编辑...这是否意味着我有 10 个变量,每个变量包含 1 兆字节或 10 个变量指向 1 兆字节?

【问题讨论】:

    标签: php arrays memory reference pointers


    【解决方案1】:

    只有一个,如果你不修改它们。

    但是 php 不是你可以依赖任何特定行为的语言 ;-)

    刚试过:

    <?php
    
    printf("%10d\n",memory_get_usage());
    $a = array_fill(0,30000,'oh');
    printf("%10d\n",memory_get_usage());
    $b = $a;
    printf("%10d\n",memory_get_usage());
    $b[] = '';
    printf("%10d\n",memory_get_usage());
    

    输出:

        325524
       2256916
       2256980
       4188316
    

    【讨论】:

    • 很好的建议,在您自己证明之前,切勿相信任何人或文档关于内存使用的建议。 PHP 在不断变化,几年前的真实情况可能不再真实。提醒一下,如果您仔细观察内存使用情况,您可能会不高兴 PHP5 在 OOP 代码中的低效。但当然,这始终取决于您在做什么。
    • TravisO,这不是我对 PHP 不满意的唯一事情 ;-)
    • @michael:你打错了,你的意思是“你不能依赖”
    • @Michael:我在编写 PHP 代码时尽量避免使用 OOP,我一直希望 PHP6 会更好,但我还没有尝试过任何测试版并测量了内存使用情况。 PHP 5.3 与 5.2 相比没有任何显着差异,但这不是像 6 那样的主要版本。
    • 不,没有错字。我说 php 不是可以的语言;-)而且我从 2.0 开始就讨厌 PHP 并且没有任何希望。
    【解决方案2】:

    我的理解是,正如您编写的那样,您将获得 10 个数组,每个 1MB。

    如果你使用 & 传入一个引用变量并返回一个指针,或者在函数名前面使用 & 来返回一个引用返回值,你可以做你想做的事情。

    【讨论】:

    • 我一直认为 php 类属性被引用了 :S
    • 我可能错了。尝试编辑您返回的数组,看看它是否在您的其他引用中发生变化,这会告诉您它是否被引用。
    • Ozzy,我认为您的意思是对象是通过引用而不是属性传递的。
    猜你喜欢
    • 2011-04-29
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2011-04-28
    相关资源
    最近更新 更多