register_shutdown_function还是ignore_user_abort?

时间:2012-05-13 16:27:44

标签: php performance background-process

嘿,我见过人们推荐他们每个人,其中一个人认为register_shutdown_function更好但没有探索。

我在谈论哪个更好地发送回复并仍然执行其他任务。 我想到了什么是更好的方法和原因。

修改register_shutdown_function文档中,有人发布了以下方法:

<?php 
function endOutput($endMessage){ 
    ignore_user_abort(true); 
    set_time_limit(0); 
    header("Connection: close"); 
    header("Content-Length: ".strlen($endMessage)); 
    echo $endMessage; 
    echo str_repeat("\r\n", 10); // just to be sure 
    flush(); 
} 

// Must be called before any output 
endOutput("thank you for visiting, have a nice day'); 

sleep(100); 
mail("you@yourmail.com", "ping", "im here"); 
?>

它能比我说的任何功能更好吗?

2 个答案:

答案 0 :(得分:1)

ignore_user_abort()告诉PHP / Apache在用户断开连接时不终止执行。 register_shutdown_function只允许你在PHP正在关闭的过程中进行一些清理。

register_shut_down仅在您需要进行一些PHP正常关机例程不需要处理的清理时才有用,例如:删除手动创建的锁定文件,在某处的DB记录中翻转一下等等......

答案 1 :(得分:0)

在旧版本的PHP(Apache下的&lt; 4.1.0)中,register_shutdown_function()将确保在关闭函数运行之前关闭连接。这已不再是这种情况。如果您没有打开任何输出缓冲区,编辑中的endOutput()函数应该确实可以执行您想要的操作。虽然,它确实将脚本设置为能够在必要时永久运行,如果它进入无限循环(特别是在调试期间),这可能会很烦人。您可能希望更改set_time_limit()以使用实际反映脚本应该花费多少秒的值。

如果你不需要,最好避免使用register_shutdown_function(),因为它有一些其他奇怪的行为(例如,如果第一个关闭函数调用exit,则无法添加第二层关闭函数来运行( ))。