使用memcached的PHP会话。会话_destroy()不删除memcache项

使用memcached的PHP会话。会话_destroy()不删除memcache项,php,session,memcached,Php,Session,Memcached,使用memcached处理会话时,我的行为非常奇怪。 看起来我的用户正在共享会话,没有任何原因 用例: 我已登录,正在获取“xxx”的PHPSESID。毫无理由,另一台计算机上的另一个用户会得到相同的PHPSESSID,当然也会看到我的个人资料和所有其他会话数据 从您的头脑中,会话_start()发出已创建的sessiond的原因可能是什么 经过数小时的调试,我注意到唯一一件“奇怪”的事情是“注销”操作没有删除该会话的memcached条目 // Resume session. session

使用memcached处理会话时,我的行为非常奇怪。 看起来我的用户正在共享会话,没有任何原因

用例:

我已登录,正在获取“xxx”的PHPSESID。毫无理由,另一台计算机上的另一个用户会得到相同的PHPSESSID,当然也会看到我的个人资料和所有其他会话数据

从您的头脑中,会话_start()发出已创建的sessiond的原因可能是什么

经过数小时的调试,我注意到唯一一件“奇怪”的事情是“注销”操作没有删除该会话的memcached条目

// Resume session. session_start(); // Unset all session data. $_SESSION[V::$SESS_NAME] = array(); // Kill session cookie. if(ini_get('session.use_cookies')) { $params = session_get_cookie_params(); // Send this cookie to the past. Time travel - possible! setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']); } // Destroy the session. session_destroy();
//恢复会议。 会话_start(); //取消设置所有会话数据。 $\会话[V::$SESS\U名称]=数组(); //杀死会话cookie。 if(ini_get('session.use_cookies')) { $params=会话获取cookie参数(); //将此cookie发送到过去。时间旅行-可能! setcookie(session_name(),'',time()-42000,$params['path'],$params['domain'],$params['secure'],$params['httponly']); } //销毁会话。 会话_destroy(); 其他人在使用PHP memcached会话时是否也经历过类似的行为

谢谢,
Mike

memcached和PHP的会话函数(如
session_destroy()
)不相关
session\u destroy()
只结束一个PHP会话;它与memcached无关。如果您还想删除memcached条目,则需要显式删除。

经过一些调试后,我确定了问题,这是由Varnish引起的。显然,页面正在缓存标题

边缘情况:

  • 用户A来到网站,请求新鲜(无cookie),得到一个清漆未命中,得到一个会话cookie。登录了
  • 用户B来到网站,请求新鲜(没有cookies),得到一个点击。Varnish发送先前兑现页面的标题(带有设置Cookie)。用户B获得会话id为用户a的会话cookie。用户B自动登录到用户a配置文件

很抱歉没有指出,该堆栈已运行清漆。在深入调试之前,我自己并不知道。

Hm。。。因此,session_start()会将memc.sess.key.SESSIONID添加到memcached,写入$_session会将值写入memc.sess.key.SESSIONID,但是session_destroy()不会从memcached中删除memc.sess.key.SESSIONID?如果这是真的,你是否从经验中知道这一点,或者我是否有可以读取的链接?@userfuser set cookie header不会进入缓存,命中时也不会返回响应。在我的情况下,Varnish也是罪魁祸首。但对我来说,Varnish显然也在缓存烹饪过的页面,因为在浏览器中PHP会话在那里停留了一会儿,然后消失了,然后又回来了一会儿。禁用清漆后,问题消失了。