我调试和搜索了很长一段时间,但我无法弄清楚发生了什么。这是我第一次做custom session handler
,所以我担心我会忽略一些非常明显的事情。我想实现一个自定义会话处理程序,以便我可以在会话中存储其他信息,并能够暂时禁止对某些用户组访问网站的受保护区域。
我的登录页面(基本的基于文件的php会话工作正常),包括一个包含会话处理函数和我的错误处理程序的很多函数的php文件。包含文件包括执行数据库连接的第三个文件。使用mysqli_connect()
建立连接,结果链接存储在变量$dbc
中。在整个站点中使用相同的连接来记录错误,加载/编辑站点内容等。我决定使用相同的数据库连接,因为它已经在每个页面上使用,并且我的会话处理程序将需要在几乎每个页面上使用同样。我的代码中没有任何地方可以手动关闭数据库连接,但我想也许它会以某种方式自动关闭。
我的函数使用全局语句访问数据库连接($ dbc)。例如:
function sess_write($id, $data)
{
global $dbc;
...
我的open
,read
和write
函数应该以这种方式使用变量。我在open和read函数中检查了数据库连接变量,它按预期非空,但在我的write函数中它突然显示为null。 PHP是否在读取和写入之间执行某些操作可能会关闭该连接?我在创建数据库连接的同一个包含文件中创建了一个测试变量,并在write函数中使用了相同的global $test;
语句,并且该变量看起来很好,所以我猜它有事情要做数据库关闭。我尝试使用第二个变量来存储数据库连接(仅供会话处理程序使用),但也没有。有任何想法吗?我像往常一样愚蠢吗?
答案 0 :(得分:0)
根据您的说明,这是正确的 - 在写入和关闭之前将丢弃对象。传统的解决方法是使用register_shutdown_function。 PHP 5.4现在有an interface,您可以使用它来编写简化此过程的会话处理程序类。如果在会话类中实现接口,当您将其传递给session_set_save_handler()时,它默认设置为您注册关闭调用。