PHP:析构函数与register_shutdown_function - php

我有一个PHP类,可以动态创建PNG图像并将其发送到浏览器。 PHP手册说,我需要确保在最后调用imagedestroy函数以释放内存。现在,如果我不使用类,则将有如下代码:

function shutdown_func() 
{
    global $img;
    if ($img)
        imagedestroy($img);
}
register_shutdown_function("shutdown_func");

但是,我认为对我的班级来说适当的地方是在班级的析构函数中调用imagedestroy。

我没有发现析构函数是否以关闭函数的相同方式调用?例如,如果在用户按下浏览器中的“停止”按钮时执行停止。

注意:无论您在答案中写什么,都请指向支持它的某些文章或手册页(URL)。

参考方案

我刚刚用Apache测试过,PHP被用作Apache模块。我创建了一个无限循环,如下所示:

<?php
class X
{
    function __destruct()
    {
        $fp = fopen("/var/www/htdocs/dtor.txt", "w+");
        fputs($fp, "Destroyed\n");
        fclose($fp);
    }
};

$obj = new X();
while (true) {
    // do nothing
}
?>

这是我发现的:

在Firefox中按STOP按钮不会停止此脚本
如果我关闭Apache,则不会调用析构函数
当到达PHP max_execution_time并且停止调用destuctor时,它将停止

但是,这样做:

<?php
function shutdown_func() {
    $fp = fopen("/var/www/htdocs/dtor.txt", "w+");
    fputs($fp, "Destroyed2\n");
    fclose($fp);
}
register_shutdown_function("shutdown_func");

while (true) {
    // do nothing
}
?>

shutdown_func被调用。因此,这意味着类构造器不如关闭函数好。

PHP:获取调用引用的数组名称 - php

假定以下函数并调用:function doSomething( &$someArray ) { // Do something to $someArray } $names=array("John", "Paul", "George", "Ringo"); doSomet…

PHP:从函数返回值并直接回显它? - php

这可能是一个愚蠢的问题,但是……的PHPfunction get_info() { $something = "test"; return $something; } html<div class="test"><?php echo get_info(); ?></div> 有没有办…

如何在函数(PHP)中使用类的方法? - php

我正在尝试使用新的PHP mysqli扩展。我有一个函数(safe())递归使用mysql_real_escape_string使字符串安全。如何在此函数内部使用mysqli连接来调用mysqli :: escape_string()函数?例:$db = new mysqli($host,$user,$password,$database_name); fu…

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

返回值与传递对象引用 - php

在某个时候,有人建议我,PHP脚本的缓慢可能部分是因为我从函数返回了一个大数组。相反,他建议将对象引用传递给该函数,并使该函数直接在数组上工作。如果这有很大的不同,我正计划将函数样式更改为返回有关函数执行的信息数组(时间基准,尝试等),并直接在对象引用上工作。所以你怎么看? 参考方案 不,没有任何区别。PHP实现了copy-on-write,这意味着即使您将…