正如我在上面的評論中所說的,多個對象實例的混合狀態聽起來像是一個設計缺陷。我認爲你總是希望一個對象的所有實例都是最新的,或者至少不要觸及緩存。我認爲你的緩存和/或對象加載圖層可以處理這個問題。
要回答你的根本問題,我寫了a script to test PHP's shutdown sequence:
<?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
似乎輸出緩衝和會話寫入/刷新近2個地方你知道你的所有物體都被毀壞了。 (這也假設你沒有使用session_set_save_handler的新形式,它可以將自己註冊爲關機功能。)
有趣的問題。 「對於頁面加載過程中創建的同一對象的任何兩個實例,有可能需要自行清除,而另一個可能需要自行緩存」聽起來像是一個設計缺陷。你不是總希望一個對象的所有實例都是最新的嗎?我認爲你的緩存/加載層可以處理這個問題。 (我不知道什麼關於bitweaver具體。) –
嗨馬特,設計缺陷評論讓我思考。您是正確的,現在我只是在嘗試將對象存儲在緩存之前檢查清除的列表。這是一個更合適的解決方案,但是如果可能的話,我仍然很想知道如何在PHP中執行最後的「最後一次調用」函數。 – Stickley