【问题标题】:Is all memory released when php request ends?php请求结束时是否释放所有内存?
【发布时间】:2013-01-04 07:20:09
【问题描述】:

在 php 中,分配给运行我的脚本的所有内存是在我的页面请求结束时释放的,还是我需要担心随着时间的推移内存泄漏?

【问题讨论】:

  • PHP 会在请求结束后释放所有内存。它不会泄漏内存。但是,您可以在脚本中联系memory_limit,但那是另一回事了。

标签: php memory-management memory-leaks


【解决方案1】:

没有。您无需手动释放(调用unset())资源。 PHP 将自动执行此操作。在请求生命周期结束时,一切都将被释放。所以不,您不需要需要为此烦恼。如果你这样做:

<?php
$resource = allocate_heavy_resource();
?>

$resource 将在请求结束时被释放,因此这不会泄漏内存。如果确实如此,则意味着 PHP 中存在严重错误,并且任何关于正常操作的讨论都会通过窗口进行。

编辑: 当然,也有例外。就像持久的数据库连接一样。但这些最终都会得到处理,所以它并不是真正的memory leak

【讨论】:

    【解决方案2】:

    PHP 确实释放了您通过构建对象等方式声明的内存。仍然存在未释放内存的情况。为此在 5.3 版本中引入了垃圾回收的原理。

    您可以使用 gc_enable() 函数来执行它。 PHP 中的垃圾收集默认情况下是不活动的。

    【讨论】:

    • 你的意思是存在这样一种情况,我在一个请求中分配一个资源,它会持续到第二个请求?我想看看这个例子。
    • 我没有看到你将能够在另一个请求中使用内存。我说它并不总是被释放,当然也不会立即被释放。如果您需要共享内存,您应该使用其他工具(例如,我推荐使用 APC 进行缓存)。
    【解决方案3】:

    有点,当缓存东西时会发生内存泄漏。因此,如果您的 php 脚本中有内存泄漏,您的 apache 进程会随着时间的推移而增加,您可以在收到这么多请求后重新启动它们。检查您的多处理模块 (MPM) 通常是 prefork 或 worker。

    大多数情况下,除非您使用 PHP 进行大量处理,否则这不会对您产生太大影响

    【讨论】:

      【解决方案4】:

      是的,脚本终止后会释放所有内存。但是,基于某些算法,在您的脚本期间可能会发生内存泄漏。您可以使用unset() 来释放变量,但与vanneto 的观点相反,它将使用not actually free up the memory

      【讨论】:

      • 使用过多内存会导致内存泄漏?
      • PHP 使用的内部缓存怎么样?他们总是在每次请求后释放吗?
      • @ta.speot.is - 你想到了什么内部缓存?像 APC 这样的缓存的全部意义在于保存请求之间的编译代码和数据
      • @MarkBaker PHP 内部使用的任何可能在请求之间持续存在的缓存。
      • @ta.speot.is 内存!= 缓存。
      【解决方案5】:
      猜你喜欢
      • 2014-04-05
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多