【发布时间】:2011-09-26 18:56:35
【问题描述】:
我在 PHP(版本 5.2.10)的会话处理中遇到问题。我正在使用下面提到的功能进行登录、注销和验证会话。
登录() { session_set_cookie_params(0); session_start(); session_regenerate_id(true); $_SESSION['user_id'] } 验证会话() { session_set_cookie_params(0); session_start(); if (isset($_SESSION['user_id']) === FALSE) { session_destroy(); 登出(); header("位置:登录页面"); } } 登出() { session_set_cookie_params(0); session_start(); $_SESSION = 数组(); setcookie(session_name(), '', time() - 3600, '/'); session_destroy(); }每个页面首先调用 validate_session() 函数。如果会话无效,它将重定向到登录页面。 login() 函数用于为用户创建会话。 当用户点击注销时,会调用 logout() 函数来销毁会话。
问题是:logout() 函数随机抛出警告:
Warning: session_destroy(): Session object destroy failed
我很少收到此警告。就像在 20-30 次注销电话中一样,我得到了一次。有什么想法吗?
我在 windows xp 机器上开发。
更新:会话存储在文件系统中。
路径:C:\WINDOWS\Temp
【问题讨论】:
-
看来你已经很久没有在stackoverflow上接受任何答案了...
-
是的!我在stackoverflow中不是很活跃。在某些情况下,我还没有得到满意的答案。
-
嗨 Varun,您能解释一下为什么在比较中使用trip equals吗?通常 if(!isset()) 就足够了,我知道它更铁定但 isset() 应该只返回一个布尔值,你真的需要验证它的类型吗?这可能不太可能,但也许偶尔会在不应该的时候返回 true?
-
建议将
debug_print_backtrace()添加到注销功能,并跟踪输出然后比较输出,如果有差异,可能是不同的调用路径产生了错误。 (见php.net/manual/en/function.debug-print-backtrace.php) -
感谢大家的建议。我无法重现此内容(我使用与之前相同的代码)。事实上,我很久没看到这个错误了。现在我不知道是什么原因造成的。