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');
}
这样,用户就可以无缝继续其编辑工作,无需手动保存。