当脚本结束时,“写入”函数就会被调用,然后就是“关闭”函数,除非会话被销毁了,而这种情况下,“写入”函数不会被调用。但是,在“关闭”函数之后,“销毁”函数将会被调用。
.session_set_save_handler()函数参数顺序不能更改,因为它们一一对应 open 、close、read、、、、
会话数据最后将会以数据序列化的方式保存在数据库中。
3、使用新会话处理程序使用新会话处理程序只是调用session_set_save_handler()函数,使我们的自定义函数能够被自动调用而已。其他关于会话的操作都没有发生变化(以前怎么用现在怎么用,我们的函数会在后台自动被调用),包括在会话中存储数据,访问保存的会话数据以及销毁数据。
在这里,我们新建 sessions.php 文件,该脚本将在没有会话信息时���建一些会话数据,并显示所有的会话数据,在用户点击 ‘log out’(注销)时销毁会话数据。
代码:
<?php //引入sessions.inc.php文件,即上面的代码 require('sessions.inc.php'); ?> <!doctype html> <html lang='en'> <head> <meta charset="utf-8"> <title>DB session test</title> </head> <body> <?php //创建会话数据 if(empty($_SESSION)){ $_SESSION['blah'] = "umlaut"; $_SESSION['this'] = 12345; $_SESSION['that'] = 'blue'; echo "<p>Session data stored</p>"; }else{ echo "<p>Session data exists:<pre>".print_r($_SESSION,1)."</pre></p>"; } if(isset($_GET['logout'])){ //销毁会话数据 session_destroy(); echo "<p>session destroyed</p>"; }else{ echo "<a href='https://www.linuxidc.com/sessions.php?logout=true'>log out</a>"; } echo "<p>session data :<pre>".print_r($_SESSION,1)."</pre></p>"; echo '</body></html>'; session_write_close(); //下面重点解析 ?> </body>解析 session_write_close():
顾名思义,该函数就是先写入会话数据,然后关闭session会话,按道理这两步在脚本执行完后会自动执行,为什么我们还要显式调用它呢?因为这里涉及到了数据库的连接!
由于我们知道,PHP会在脚本执行完后自动关闭数据库的所有连接,而同时会话函数会尝试向数据库写入数据并关闭连接。这样一来就会导致会话数据没法写入数据库,并且出现一大堆错误,例如write_session()、close_session()函数中都有用到数据库的连接。