2012-06-22 116 views
1

我需要担心PHP的内存泄漏吗?特别是,我有以下从浏览器中调用的代码。当调用完成时,是否正确清理了所有内容,或者,是否需要清除由创建的第一个数组创建的内存?PHP内存管理和阵列

class SomeClass 
{ 
    var $someArray = array(); 

    function someMethod() 
    { 
    $this->someArray[1] = "Some Value 1"; 
    $this->someArray[2] = "Some Value 2"; 
    $this->someArray[3] = "Some Value 3"; 
    $this->someArray = array(); 
    $this->someArray[1] = "Some other Value"; 
    $this->someArray[2] = "Some other Value"; 
    $this->someArray[3] = "Some other Value"; 
    } 
} 

someMethod(); 

感谢, 斯科特

+2

每个脚本调用都会启动一个新的PHP进程。这些呼叫之间的所有内存都会丢失。 – mario

回答

3

我需要担心PHP的内存泄漏吗?

很可能在PHP循环引用,其zvalrefcount从来没有下降到0。这会导致内存泄漏(GC不会清除引用它们的对象)。这已经修复在> = PHP 5.3中。

特别是,我从浏览器中调用以下代码。当调用完成时,是否正确清理了所有内容,或者,是否需要清除由创建的第一个数组创建的内存?

PHP脚本有请求生命周期(运行应用程序,返回响应,关闭应用程序),所以它不应该是一个隐忧。应用程序完成时,应用程序使用的所有内存都应标记为“已释放”,并准备在下一次请求时被覆盖。

+1

我相信从PHP 5.3起,循环引用问题已得到解决。 – Corbin

+0

@Corbin你是对的,只是发现它在一些[幻灯片](http://www.slideshare.net/phpcodemonkey/whats-new-whats-hot-in-php-53)中提到。我会做一个编辑。 – alex

1

如果你是超级偏执狂,你可以随时unset的事情,但是,PHP是一个垃圾回收语言的含义,除非有在核心或扩展的错误,永远不会有内存泄漏。

More information


在一个侧面说明,你应该使用较新的PHP 5 OOP的语法。而且,有些方法会是一个错误。它需要是$ obj-> someMethod(),其中$ obj是类的一个实例。

+0

太好了。谢谢... –

1

如果通过Apache运行mod_php并使用mpm_prefork行为,实际上确实存在内存问题。问题是PHP使用的内存不会被释放回操作系统。相同的Apache进程可以为后续请求重用内存,但不能被其他程序使用(甚至不能用于其他Apache进程)。

一个解决方案是不时重新启动进程,例如将MaxRequestsPerChild设置设置为较低(100左右,对于轻度加载的服务器可能较低)。最好的解决方案是根本不使用mod_php,而是通过FastCGI运行PHP。

这是一个系统管理员问题,但不是程序员问题。

+0

+1相关知识 – alex