PHP对象创建和内存使用

PHP对象创建和内存使用,php,object,memory,Php,Object,Memory,一个基本的虚拟类: class foo { var $bar = 0; function foo() {} function boo() {} } echo memory_get_usage(); echo "\n"; $foo = new foo(); echo memory_get_usage(); echo "\n"; unset($foo); echo memory_get_usage(); echo "\n"; $foo = null; echo memory

一个基本的虚拟类:

class foo
{
    var $bar = 0;
    function foo() {}
    function boo() {}
}
echo memory_get_usage();
echo "\n";
$foo = new foo();
echo memory_get_usage();
echo "\n";
unset($foo);
echo memory_get_usage();
echo "\n";
$foo = null; 
echo memory_get_usage();
echo "\n";
产出:

$ php test.php
353672
353792
353792
353792
现在,我知道PHP文档说在需要内存之前不会释放内存(达到上限)。然而,我写这篇文章是作为一个小测试,因为我有一个更长的任务,使用一个更大的对象,以及该对象的许多实例。而记忆在不断攀升,最终耗尽并停止执行。即使这些大对象确实占用内存,但由于我在处理完每个对象(串行)后销毁了它们,所以它不应该耗尽内存(除非单个对象耗尽了整个内存空间,事实并非如此)


想法?

您是否有任何循环引用可以阻止垃圾收集器执行其任务

我运行了一个快速测试,创建了1000000个对象,但内存没有用完:

class foo
{
    var $bar = 0;
    function foo() {}
    function boo() {}
}

echo memory_get_usage() . "\n";

$foo = new foo();
unset($foo);

echo memory_get_usage() . "\n";

for ($i = 0; $i < 1000000; $i++)
{
    $var = 'foo' . $i; // Use a different variable name each time
    $$var = new foo();
    unset($$var);
}

echo memory_get_usage() . "\n";
class-foo
{
var$bar=0;
函数foo(){}
函数boo(){}
}
回显内存\u获取\u用法()。“\n”;
$foo=新foo();
未结算($foo);
回显内存\u获取\u用法()。“\n”;
对于($i=0;$i<1000000;$i++)
{
$var='foo'.$i;//每次使用不同的变量名
$$var=new foo();
未设置($$var);
}
回显内存\u获取\u用法()。“\n”;

65080 65384 65568PHP对对象和类的支持在5.2版中不是很有效(过去也不是),但即将到来的5.3和6.0在类和对象使用方面是一次大的改进,您将看到它们的速度和内存都有了提高

我还用PHP5.2.x编写了一些基本框架,发现内存使用量也惊人地膨胀。尽管考虑到功能强大的多核CPU和ram是多么便宜,但我还是要说,以一种对您来说最有意义的方式进行编码,并创建一个更加灵活的设置

如果使用Smarty或Drupal使您的工作项目更快地完成,那么请使用它们,或者使用您所做的任何自定义内容。不要让今天糟糕的内存/速度使用率让您对OOP或框架望而却步,因为明天的版本有一些值得注意的改进(现实世界的基准测试显示,相同代码的速度提高了30%)


PS:您的设置有问题,我在Windows XP的Apache/w PHP 5.2.8上运行了相同的代码,得到了:60872 61080 61080 61080

<?php
class foo
{
    public $bar = 0;
    function foo(){}
    function boo(){}
}

echo memory_get_usage() . "\n";

$foo = new foo();
unset($foo);

echo memory_get_usage() . "\n";

$arr = array(new foo());

for ($i = 1; $i < 1000000; $i += 2)
{
    $arr[$i] = new foo();
    $arr[$i - 1] = new foo();
    unset($arr[$i], $arr[$i - 1]);
}

echo memory_get_usage() . "\n";

for ($i = 1; $i < 1000000; $i += 2)
{
    $arr[$i] = new foo();
    $arr[$i - 1] = new foo();
    $arr[$i]->bar = $arr[$i-1];
    $arr[$i-1]->bar = $arr[$i];
    unset($arr[$i], $arr[$i - 1]);
}

echo memory_get_usage() . "\n";

在5.2.8版本的Windows上,我得到了62360 62528 62712,它甚至更小:)你是说硬件可以解决这个问题吗?我遇到了完全相同的问题,内存不断攀升,直到脚本崩溃,而CPU一直是100%(双核3.06 Ghz intel,8 Gigs Ram)。我曾想过用硬件解决我的问题。四核处理器的执行速度会加倍吗?一个六边形核心会使它翻两番吗?(假设每个场景的RAM数量相同)当内存使用量逐渐增加时,就会出现未清理的bug或漏洞。您需要更深入地了解这方面的帮助,但95%的人处理这一问题的方式是重新启动脚本/会话/Web服务器/服务器。内存使用缓慢是服务器设置最慢和最不稳定的原因,有时除了运行Web服务器、PHP、MySQL等的最新副本之外,根本没有修复程序,希望bug存在并得到修复。
644392
644392
644848
1628592