2012-08-11 51 views
0

我调试和搜索了一段时间,我无法弄清楚发生了什么。这是我第一次做custom session handler,所以恐怕我忽略了一些显而易见的事情。我想实现一个自定义会话处理程序,以便我可以在会话中存储更多信息,并且能够暂时禁止某些用户组访问该网站的受保护区域。PHP自定义会话处理程序 - 数据库连接变为NULL

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

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

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

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

+0

发布后,我在相关帖子中找到了一个链接,可能是我正在寻找的答案。这是引用: “从PHP 5.0.5开始,写入和关闭处理程序在对象销毁后调用,因此不能使用对象或抛出异常。” 现在我猜测,mysqli_connect函数实际上是创建一个对象,它可以在写函数中使用之前被销毁。如何使该连接可以通过写入功能访问?我正在继续阅读这个主题,很抱歉发布过早。 – dnag 2012-08-11 05:02:41

+0

我遇到的解决方案是使用基于对象的数据库连接形式,并有一个析构函数重新创建连接。但连接被破坏和重新创建似乎很奇怪。当我使用它时,是否有任何其他方式将数据库连接传递给写入函数?或者这个课程解决方案我应该做什么?我猜我不能将参数添加到写函数,因为传递给这些函数的内容是由php内部处理的。全局变量正在被传递,但是我使用的变量是对象的引用。 – dnag 2012-08-11 05:13:37

+0

由于该对象已被销毁,因此它解释了为什么文本变量可以正常工作,但$ dbc变量没有。我理解这个权利吗? – dnag 2012-08-11 05:14:08

回答

0

根据您的笔记,这是正确的 - 在写入和关闭之前,对象将被丢弃。传统的解决方法是使用register_shutdown_function。 PHP 5.4现在有an interface,您可以使用它来编写会简化此过程的会话处理程序类。如果您在会话类中实现接口,那么当您将其传递给session_set_save_handler()时,它将默认为您设置注册关机呼叫。