session_register_shutdown()是一個註冊會話寫入關閉鉤子的函數,它在PHP 腳本執行完畢之前自動調用session_write_close() 。這意味著,在腳本執行的最後階段,無論是否調用了session_start() ,該函數註冊的寫入行為都會被執行。
這為我們提供了一個機會,在用戶的會話即將結束時,捕捉並保存重要的數據,如用戶編輯的內容、表單狀態、臨時設置等。
假設你正在開發一個在線文檔編輯器。用戶在編輯過程中可能突然關閉瀏覽器或網絡中斷。為了避免數據丟失,你希望在用戶離開前自動保存其草稿內容。
你可以通過在每次請求中註冊一個自動保存邏輯,並利用會話機制保留數據,實現“臨時保存”功能。
我們以一個簡單的編輯器頁面為例,演示如何使用session_register_shutdown()實現自動保存功能。
確保你的服務器啟用了session 支持,並在PHP 文件開始處調用session_start() :
<?php
session_start();
接著,我們使用session_register_shutdown()註冊一個函數,用於保存用戶當前編輯的內容。
function autoSaveDraft() {
if (isset($_POST['content'])) {
$_SESSION['autosave'] = $_POST['content'];
file_put_contents('/tmp/autosave_' . session_id() . '.txt', $_POST['content']);
}
}
session_register_shutdown('autoSaveDraft');
這裡,我們不僅將內容保存到了$_SESSION中,還將其寫入了臨時文件/tmp/autosave_<session_id>.txt ,以便後續恢復。
然後,在頁面中構建一個簡單的表單,供用戶輸入內容:
<form method="POST" action="http://m66.net/editor.php">
<textarea name="content" rows="10" cols="50"><?php echo htmlspecialchars($_SESSION['autosave'] ?? ''); ?></textarea>
<br>
<input type="submit" value="保持">
</form>
每次表單提交時,內容都會通過自動保存機制寫入會話和文件中,確保即便用戶意外離開,也能在返回頁面時恢復編輯狀態。
如果你想在用戶重新打開頁面時自動恢復其上一次的草稿,可以在加載頁面時添加以下邏輯:
if (file_exists('/tmp/autosave_' . session_id() . '.txt')) {
$_SESSION['autosave'] = file_get_contents('/tmp/autosave_' . session_id() . '.txt');
}
這樣,用戶就可以無縫繼續其編輯工作,無需手動保存。