我需要担心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();
谢谢斯科特
在我需要担心 PHP 的内存泄漏吗?
PHP 中可以有一个循环引用,其中zval
的refcount
永远不会下降到0
。这将导致内存泄漏(GC 不会清理引用它们的对象)。此问题已在>= PHP 5.3 中修复。
特别是,我有以下从浏览器调用的代码。调用完成后,是否所有内容都已正确清理,或者,我是否需要清除创建的第一个阵列创建的内存?
PHP 脚本具有请求生命周期(运行应用程序、返回响应、关闭应用程序),因此不必担心。应用程序使用的所有内存都应在应用程序完成时标记为空闲,以便在下一个请求时被覆盖。
如果你超级偏执,你总是可以unset
事情,但是,PHP 是一种垃圾回收语言,这意味着除非核心或扩展中存在错误,否则永远不会有内存泄漏。
更多信息
附带说明一下,您应该使用较新的 PHP 5 OOP 语法。 而且,有些方法会是一个错误。 它需要是$obj->someMethod(),其中$obj是类的一个实例。
如果您使用mpm_prefork行为通过 Apache 运行mod_php,则确实存在内存问题。问题是 PHP 消耗的内存不会释放回操作系统。同样的 Apache 进程可以为后续请求重用内存,但它不能被其他程序使用(甚至不能被其他 Apache 进程使用)。
一种解决方案是不时重新启动进程,例如,通过将 MaxRequestsPerChild 设置设置为相当低的值(100 左右,对于负载较轻的服务器可能更低)。最好的解决方案是根本不使用mod_php,而是通过FastCGI运行PHP。
不过,这是一个系统管理员问题,而不是程序员问题。