PHP 内存管理和数组


PHP Memory management and arrays

我需要担心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 中可以有一个循环引用,其中zvalrefcount永远不会下降到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。

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