0

我调试和搜索了很长一段时间,但我无法弄清楚发生了什么。这是我第一次做 a custom session handler,所以我担心我忽略了一些非常明显的东西。我想实现一个自定义会话处理程序,以便我可以在会话中存储其他信息,并能够暂时禁用某些用户组对站点受保护区域的访问。

我的登录页面(在基本的基于文​​件的 php 会话中运行良好)包括一个 php 文件,其中包含许多功能,包括会话处理程序函数和我的错误处理程序。该包含的文件包括执行数据库连接的第三个文件。使用建立连接mysqli_connect()并将生成的链接存储在变量中$dbc。整个站点都使用相同的连接来记录错误、加载/编辑站点内容等。我决定使用相同的数据库连接,因为它已经在每个页面上使用,并且我的会话处理程序几乎需要在每个页面上使用也是。在我的代码中,我没有手动关闭数据库连接,但我认为它可能会以某种方式自动关闭。

我的函数使用全局语句访问数据库连接 ($dbc)。前任:

function sess_write($id, $data)
{
    global $dbc;
    ...

openread, 和write函数应该以这种方式使用变量。我在打开和读取函数中检查了数据库连接变量,它如预期的那样非空,但在我的写入函数中它突然显示为空。PHP 是否在读写之间做一些可能会关闭该连接的事情?我在创建数据库连接的同一个包含文件中创建了一个测试变量,并global $test;在 write 函数中使用了相同的语句,并且该变量看起来很好,所以我猜它与关闭数据库有关。我尝试使用第二个变量来存储数据库连接(仅供会话处理程序使用),但这也不起作用。有任何想法吗?我只是像往常一样愚蠢吗?

4

1 回答 1

0

根据您的说明,这是正确的——对象将在写入和关闭之前被处理掉。传统的解决方法是使用register_shutdown_function。PHP 5.4 现在有一个接口,您可以使用它来编写一个会话处理程序类来简化这个过程。如果您在会话类中实现该接口,则当您将其传递给 session_set_save_handler() 时,它默认设置为您注册关闭调用。

于 2012-08-11T05:19:34.397 回答