正如我在上面的评论中所说,多个对象实例的混合状态听起来像是一个设计缺陷。我认为您总是希望对象的所有实例都是最新的,或者如果不是,至少不要触及缓存。我认为您的缓存和/或对象加载层可以处理这个问题。
为了回答您的基本问题,我编写了一个脚本来测试 PHP 的关闭顺序:
<?php /* Adapted from https://evertpot.com/160/ */
ob_start(
function($buffer) {
return $buffer . "output buffer flushed\n";
}
);
$empty = function() {
return true;
};
$close = function() {
echo "session close\n";
return true;
};
$write = function() {
echo "session write\n";
return true;
};
session_set_save_handler($empty, $close, $empty, $write, $empty, $empty);
session_start();
register_shutdown_function(
function() {
echo "register_shutdown_function\n";
}
);
class MyClass {
function __destruct() {
echo "object destructor\n";
}
}
$myObject = new MyClass;
输出:
register_shutdown_function
object destructor
output buffer flushed
session write
session close
似乎输出缓冲和会话写入/关闭的刷新是您知道所有对象已被破坏的两个地方。(这也假设您没有使用可以将自己注册为关闭函数的新形式的 session_set_save_handler。)