我在我的项目中使用CakePHP并在memcached上存储PHP会话。 (CakePHP使用PHP来处理会话,PHP使用memcached。)在每个用户登录时,我将用户的IP和session_id存储在数据库中。当我使用cake来处理会话时,当用户尝试登录时,我可以获取它的IP并转到数据库以从该IP地址获取最后一个会话。拥有上次登录的session_id,我可以检查会话文件是否仍然出现在会话目录上,并决定用户是否可以登录。
[OBS:我知道用户可以设置代理并绕过此信息,但由于使用该应用程序的人员的个人资料,用户通常不会知道该信息。由于应用程序是一种游戏,用户无法共享信息。至少我应该避免它。]
通过以这种方式处理日志,我遇到了一个问题,因为很多时候CakePHP注销了用户,但会话文件仍然存在。 [也许这是一个配置问题,会话超时+垃圾收集器删除文件。]我放弃解决这个问题,因为我被迫为应用程序提供了许多服务器,所以我不得不将会话移动到MySQL或memcached。由于应用程序的一部分用于纯PHP(没有CakePHP),我选择使用memcached,因为我能够使用PHP会话功能。如果我选择了MySQL,我必须在请求时传递会话ID,并且出于安全考虑,我认为这不是一个好主意。
所以,我的问题是,现在会话在memcache上,如何在用户登录尝试时检查是否有另一个用户登录到同一网络?如果我可以检查memcache密钥是否存在,那么应该解决它。有人知道如何在memcache上存储php会话吗?我发现PHP使用密钥 memc.sess.key。(来自http://php.net/manual/en/memcached.sessions.php),但我在memcache php脚本上找不到这个密钥(Harun Yayli的memcache.php)
此外,会话文件发生同样的事情可能发生在memcache上(过期的会话留下了它的密钥,可能是数据注册和过期的会话接缝仍然有效)?
的问候。
修改
找到解决方案的一部分。
我能够从“纯PHP”脚本的会话中获取数据,只需将其名称设置为CakePHP上的相同名称并“启动”会话
ini_set('session.name', 'SESSION_NAME');
session_start();
echo $_SESSION['...']
我还可以使用memcache get function(http://php.net/manual/en/memcache.get.php)获取会话数据,将旧会话ID设置为密钥。
现在,我正在尝试从memcache中读取会话数据。 (来自另一场会议的数据)
PHP存储表示会话数据的大字符串,可以序列化和/或压缩和/或加密。我可以使用$ _SESSION var,但此时我还没有登录我想检查的用户。我怎么知道PHP + Memcache对我的会话数组做了什么?
这里有一些存储在memcache上的字符串,用于表示会话数据:
jkSh95O1_5Xng-guqJlNKtFAh5Xp07pbqRX7MSHOfDlaDbQTzY_gtyLyEA7a0KjWYp9osx90iXFkEm4ZWYFOeA9Ko9JZcqDoWddgXcZR3coHAa_H0T4URBBLIwfBZ-sc7vPMW(...)