升級 PHP 5.4 後,舊專案(如 DedeCMS)登出功能出現空白頁、報錯。根因:**PHP 5.4 正式移除已棄用多年的 session_unregister() 函數**。本文說明替代方案與遷移步驟。
DedeCMS 後台登出代碼:
function exitUser() {
ClearMyAddon();
@($this->keepUserIDTag);
@session_unregister($this->keepUserTypeTag);
@session_unregister($this->keepUserChannelTag);
@session_unregister($this->keepUserNameTag);
@session_unregister($this->keepUserPurviewTag);
DropCookie('dedeAdmindir');
DropCookie('DedeUserID');
DropCookie('DedeLoginTime');
$_SESSION = array();
}
PHP 5.4 執行至 session_unregister 直接報致命錯誤導致白屏。
PHP 手冊建議使用 unset() 釋放特定 Session 變數:
// 舊寫法
session_unregister('var_name');
// 新寫法(PHP 5.4+)
unset($_SESSION['var_name']);
// 若需銷毀整個 Session
session_destroy(); // 刪除伺服器端 Session 資料
$_SESSION = array(); // 清空全域陣列
// 若使用 Cookie 傳遞 Session ID,還需刪除 Cookie
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
}
function exitUser() {
ClearMyAddon();
@($this->keepUserIDTag);
unset($_SESSION[$this->keepUserTypeTag]);
unset($_SESSION[$this->keepUserChannelTag]);
unset($_SESSION[$this->keepUserNameTag]);
unset($_SESSION[$this->keepUserPurviewTag]);
DropCookie('dedeAdmindir');
DropCookie('DedeUserID');
DropCookie('DedeLoginTime');
$_SESSION = array();
session_destroy(); // 建議補上徹底銷毀
}
session_register()、session_is_registered() 同步移除,改用 $_SESSION['key'] = $val、isset($_SESSION['key'])。session.entropy_file 改用 /dev/urandom 或 /dev/arandom 強化 Session ID 隨機性。session.hash_function 預設改為 SHA-256(舊版 MD5)。session_unregister、session_register、session_is_registered。unset($_SESSION[...])、$_SESSION[...] = ...、isset($_SESSION[...])。session_destroy() 呼叫時機,確保登出徹底。及時清理棄用函數,不僅相容新版 PHP,更能減少安全隱患與技術債。