php.ini改称 session.save_handler="user"
多服务器共享SESSION 的主要障碍及解决办法
通过了解 SESSION 的工作原理,我们可以发现,在默认情况下,各个服务器会各自分别对同一个客户端产生SESSION ID,如对于同一个用户浏览器,A 服务器产生的 SESSION ID是30de1e9de3192ba6ce2992d27a1b6a0a,而 B 服务器生成的则是c72665af28a8b14c0fe11afe3b59b51b。另外,PHP 的 SESSION 数据都是分别保存在本服务器的文件系统中。确定了问题所在之后,就可以着手进行解决了。想要共享 SESSION 数据,那就必须实现两个目标:
一个是各个服务器对同一个客户端产生的 SESSION ID 必须相同,并且可通过同一个 COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的 COOKIE;
另一个是 SESSION 数据的存储方式/位置必须保证各个服务器都能够访问到。 简单地说就是多服务器共享客户端的 SESSION ID,同时还必须共享服务器端的 SESSION数据。
SESSION数据库的优点,如果服务器采用群集的方式的话就不能保持session的一致性,所以我们就绪要采用数据库的方式来保存session, 这样,不管有几台服务器同时使用,只要把他们的session保存在一台数据库服务器上就可以保存session的完整了.还有诸如:控制一个帐号只能一个人登录,统计在线人数,踢出某个在线用户.总之用户的状态就掌握在我们手里了.并且不用修改代码.多站点共享session,实现Application变量(多用户共享的全局变量)只不过这样的功能会给数据库带来严重的I/O负担,但凡有点流量再碰上点极品的用户这样的数据库性能肯定要被严重拖累
只能单账户登录,类似qq
//login D('Admin')->where(['id' => 1])->setField('session_id', session_id()); $this->showMessage('登录成功', '', 1); //base_controller登录用户检查,不是就踢出去 if (!empty($this->admin_user_info['session_id']) && ($this->admin_user_info['session_id'] != session_id())) { $message = '账号在其他地方登录,请重新登录'; session(null); $this->showMessage($message, U('Login/index', ['lock' => 1]), 0, IS_AJAX, true); }
SessionHandlerInterface接口是PHP内置的接口,直接实现就行了
具体可以看php手册关于session_set_save_handler函数的解释!
<?php /* session信息存储到数据库的类 表结构: CREATE TABLE IF NOT EXISTS `sessioninfo` ( `sid` varchar(255) NOT NULL, `value` longtext NOT NULL, `expiration` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`sid`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; */ class MySessionHandler implements SessionHandlerInterface { /** * @access private * @var object 数据库连接 */ private $_dbLink; /** * @access private * @var string 保存session的表名 */ Private $_sessionTable; /** * @access private * @var string session名 */ private $_sessionName; /** * @const 过期时间 */ const SESSION_EXPIRE = 10; public function __construct($dbLink, $sessionTable) { if (!is_object($dbLink)) { return false; } $this->_dbLink = $dbLink; $this->_sessionTable = $sessionTable; } /** * 打开 * @access public * @param string $session_save_path 保存session的路径 * @param string $session_name session名 * @return integer */ public function open($session_save_path, $session_name) { $this->_sessionName = $session_name; return 0; } /** * 关闭 * @access public * @return integer */ public function close() { return 0; } /** * 关闭session * @access public * @param string $session_id session ID * @return string */ public function read($session_id) { $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = {$session_id} AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())"; $result = $this->_dbLink->query($query); if (!isset($value) || empty($value)) { $value = ""; return $value; } $this->_dbLink->query("UPDATE {$this->_sessionTable} SET expiration = CURRENT_TIMESTAMP() WHERE sid = {$session_id}"); $value = $result->fetch_array(); $result->free(); return $value['value']; } /** * 写入session * @access public * @param string $session_id session ID * @param string $session_data session data * @return integer */ public function write($session_id, $session_data) { $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = '{$session_id}' AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())"; $result = $this->_dbLink->query($query); $result = $result->fetch_array(); if (!empty($result)) { $result = $this->_dbLink->query("UPDATE {$this->_sessionTable} SET value = {$session_data} WHERE sid = {$session_id}"); } else { $result = $this->_dbLink->query("INSERT INTO {$this->_sessionTable} (sid, value) VALUES ('{$session_id}', '{$session_data}')"); } if ($result) { return 0; } else { return 1; } } /** * 销魂session * @access public * @param string $session_id session ID * @return integer */ public function destroy($session_id) { $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE sid = '{$session_id}'"); if ($result) { return 0; } else { return 1; } } /** * 垃圾回收 * @access public * @param string $maxlifetime session 最长生存时间 * @return integer */ public function gc($maxlifetime) { $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE UNIX_TIMESTAMP(expiration) < UNIX_TIMESTAMP(NOW()) - " . self::SESSION_EXPIRE); if ($result) { return 0; } else { return 1; } } } /**************************************************************************************/ $dbLink = new mysqli("localhost", "root", "", "test"); $sessionTable = "sessioninfo"; $handler = new MySessionHandler($dbLink, $sessionTable); session_set_save_handler($handler); session_start(); $_SESSION['name'] = "test"; echo $_SESSION["name"]; //session_destroy();
相关推荐
标题所提及的"php中将session保存到数据库的函数类代码",就是用来实现这一功能的。这种自定义Session处理方式通常通过`session_set_save_handler()`函数来完成,该函数允许我们注册自定义的Session存储和恢复的...
总的来说,将PHP的Session保存到数据库是一种增强Session管理的有效方式。通过编写一个自定义的处理器类并使用`session_set_save_handler()`函数,我们可以确保Session数据的安全性和可靠性,同时还能根据项目需求...
这里我们关注的是如何使用session来模拟数据库实现用户登录功能。session是一种服务器端存储用户状态的技术,它可以帮助我们在用户浏览器关闭或刷新后仍然保持某些信息,例如用户的登录状态。下面将详细阐述session...
本主题聚焦于“PHP MySQL数据库存储session”,这涉及到如何使用PHP将用户的session数据存储在MySQL数据库中,以实现更安全、可扩展的会话管理。 首先,让我们了解一下session的基本概念。Session是一种在服务器端...
### PHP 解决读存数据库乱码问题 在开发过程中,我们经常会遇到数据库中中文字符显示乱码的问题。尤其是在使用PHP连接MySQL数据库时,这一问题尤为突出。本文将详细介绍如何通过PHP来解决数据库读写过程中的乱码...
这个"php注册与登录小Demo"展示了如何利用PHP、session以及数据库来实现这一功能,同时区分管理员和普通用户。这里我们将深入探讨相关知识点。 1. **PHP Session**: PHP session是用于在用户浏览器会话之间存储...
`gc()`函数则用于定期清理数据库中过期的Session记录,以保持数据库的整洁。 总结来说,Cookie和Session是PHP中处理用户状态的重要工具,它们各有优缺点。将Session数据存储到数据库能提高系统的稳定性和可扩展性,...
本文介绍了一个用于将PHP Session保存到数据库的PHP类。这个类可以帮助开发者将用户的会话数据存储在数据库中,而不是像默认情况下存储在文件或临时目录中。这样的做法在分布式应用或负载均衡环境下尤其有用,因为它...
本文将介绍一个PHP独立Session数据库存储操作类,它允许我们将Session信息存储在MySQL数据库中。 首先,我们来看一下代码结构。这个类名为`dbsession`,包含了配置数据库连接、初始化、读取和写入Session数据的相关...
本教程将探讨如何使用PHP、MySQL和SESSION技术来实现一个简单的购物车类,这将帮助开发者理解如何在数据库环境中处理用户的商品选择。 首先,PHP是一种广泛使用的服务器端脚本语言,特别适合于Web开发。在购物车...
php独立session数据库存储操作类分享.doc
这个给定的代码段展示了一个自定义的Session处理器类(`session_handler`),该类实现了将PHP Session数据存储到MySQL数据库中的功能。下面我们将详细解释这个过程中的关键知识点: 1. **自定义Session处理器**:在...
这时,可以考虑使用Session集群、Session存储到数据库或使用分布式Session解决方案(如Redis、Memcached)。 综上所述,通过Session,我们可以方便地实现用户登录和退出功能,跟踪用户的会话状态。正确管理和使用...
在PHP编程中,Session是一种非常重要的机制,用于在用户的不同页面请求之间保持状态。它允许开发者存储用户信息,如登录状态、购物车内容等,即使用户在网站上浏览不同的页面,也能保持这些信息的连续性。现在我们来...
在本文中,我们主要讨论了使用PHP语言将Session数据存储到MySQL数据库的过程。这涉及到PHP的内置函数session_set_save_handler(),它允许用户自定义Session的存储方式。通过创建一个类Session,我们能够处理session...
以下是一个将PHP session数据写入MySQL数据库的示例,详细解释了如何实现这一功能。 首先,我们创建一个名为`Session_Handler`的类,它将作为自定义session处理程序。这个类包含了处理session所需的基本方法:`open...
1. `open`方法:这个方法负责打开数据库连接,并获取session的最大生命周期(`session.gc_maxlifetime`),这个值定义了session数据在数据库中应该保持多长时间。此方法还会选择数据库,并在成功连接后将其句柄赋给...
【PHP基于Session实现数据库交互的类】 在PHP中,Session是一种常用的方法来跟踪用户的状态,尤其是在没有使用cookies或用户登录的情况下。本实例介绍了一个利用Session与数据库交互的类,通过这个类,我们可以将...
中可以看到这样的一行,session.save_handler=”files”,这样的意思就是采用文件来保存session 的,要采用数据库来保存的话,我们需要修改成拥护模式,改称 session.save_handler=”use”就可以了,但是,这仅仅是...