【问题标题】:Do I need to destroy objects in PHP after using them?使用 PHP 后需要销毁对象吗?
【发布时间】:2012-06-25 14:38:05
【问题描述】:

PHP 中的对象销毁有多重要?使用 PHP 后销毁对象重要吗?因为与 java 不同,PHP 没有垃圾收集器(我不知道)

【问题讨论】:

  • PHP 肯定有垃圾收集器。
  • PHP 5.3 中有一个内置的Garbage Collection(也称为GC)机制。

标签: php object


【解决方案1】:

一般情况下你不需要销毁对象,PHP 肯定是does have a garbage collector。此外,大多数简单的脚本甚至都不需要,因为每个 HTTP 请求都会拆除和重建整个环境;垃圾收集器帮助那些在处理单个请求时内存不足的脚本。

一般情况的例外情况:

您可能希望“丢失”对消耗大量内存和/或包装非托管资源的对象的所有引用;这通常很简单

$largeObject = null; // reference to previous value lost

如果这是对$largeObject 的最后一次引用,那么:

  • PHP 将立即调用析构函数(如果存在);如果您的脚本是长期存在的,您可能希望对包装非托管资源(例如数据库连接、套接字等)的对象执行此操作。
  • 对象占用的内存现在可以进行垃圾回收了。但是,收集不会在现场进行,而是在稍后需要更多内存的时候进行(尽管您可以随时调用gc_collect_cycles 强制进行垃圾收集)。

当然,在“服务请求然后退出”的典型情况下,所有这些都没有考虑到。

【讨论】:

【解决方案2】:

通常这不是您必须考虑的问题。 这是一篇关于遇到此问题的人的文章。

http://paul-m-jones.com/archives/262

您可以使用此函数来销毁您喜欢的类中的任何对象。

function __destruct()
{
    //do stuff
}

一个对象可以在请求期间保留在内存中, 或者从命令行调用时,只要脚本保持运行。

【讨论】:

  • 我正在删除您的编辑;这个问题是关于 PHP 的,你已经包含了关于 .NET 垃圾收集器的信息,这是不相关的。
【解决方案3】:

有一个内置的Garbage Collection(也称为 GC)机制,它是 PHP 5.3 的一部分。

<?php
    gc_enable(); // Enable Garbage Collector
    var_dump(gc_enabled()); // true
    var_dump(gc_collect_cycles()); // # of elements cleaned up
    gc_disable(); // Disable Garbage Collector
?>

希望对您有所帮助! :)

【讨论】:

    【解决方案4】:

    php 有一个垃圾收集器,但实际上有很多情况下 php 直到 unset 函数被执行时才释放内存。这些案例是关于单例,xml,可能是结构。在我们公司,我们修补了 php 并记录了所有内存分配,并在代码中添加了 unset 函数。 但在 Web 开发中,这并不是那么重要。

    【讨论】:

      【解决方案5】:

      正如其他人所建议的那样,垃圾收集将在执行结束时完成这项工作,但是如果您有一个长时间运行的 cron,那么当您处理大量数据或大型数组时,您可能会遇到问题。

      此时的解决方案是使用 unset($object) 调用对象魔法 __destruct() 函数,如果您想对对象执行任何操作(例如将数据保存在数据库中),您可以使用该函数。

      【讨论】:

        猜你喜欢
        • 2021-11-08
        • 2020-04-06
        • 1970-01-01
        • 2011-10-20
        • 2021-06-05
        • 2017-06-03
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多