session
我没事的时候写的自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的。
一般基于文件存储Session数据效率不是很高,毕竟跟磁盘IO是有关系的,如果需要多台服务器共享数据,可以考虑使用NFS来存储数据,如果需要比较快的速度,可以考虑使用共享内存(shm)来保存数据,直接把Session数据存储路径指定为/dev/shm,这样磁盘IO会提高不少,不过shm空间比较小,一般Linux下是60多M,所以不可能保存太多数据。
php
//=======================================
// 程序:File-Based Session Class
// 功能:基于文件存储的 Session 功能类
// 作者: heiyeluren
// 博客: http://blog.csdn.net/heiyeshuwu
// 时间: 2006-12-22
//=======================================
/**
* 类名: FileSession Class
* 功能: 自主实现基于文件存储的 Session 功能
* 描述: 这个类就是实现Session的功能, 基本上是通过设置客户端的Cookie来保存SessionID,
* 然后把用户的数据保存在服务器端,最后通过Cookie中的Session Id来确定一个数据是否是用户的,
* 然后进行相应的数据操作, 目前的缺点是没有垃圾收集功能
*
* 本方式适合保存在普通文件、共享内存(SHM)、NFS服务器等基于文件存储的方式,推荐保存在共享
* 内存当中,因为共享内存存取效率比较高,但是空间比较小,重启后就销毁了
*/
class FileSession
{
var $sessId = '';
var $sessSavePath = '/tmp/';
var $isCreatePath = true;
var $sessExpireTime = '';
var $sessFilePrefix = 'sess_';
var $cookieName = '__SessHandler';
/**
* 构造函数
*
* @param bool $isInit - 是否实例化对象的时候启动Session
*/
function FileSession($isInit = false){
if ($isInit){
$this->start();
}
}
//-------------------------
// 外部方法
//-------------------------
/**
* 启动Session操作
*
* @param int $expireTime - Session失效时间,缺省是0,当浏览器关闭的时候失效, 该值单位是秒
*/
function start($expireTime = 0){
$sessId = $_COOKIE[$this->cookieName];
if (!$sessId){
if (!$this->_checkSavePath()){
$this->_showMessage('Session save path '. $this->sessSavePath .' not or create path failed');
}
$this->sessId = $this->_getId();
$this->sessExpireTime = ($expireTime > 0) ? time() + $expireTime : 0;
setcookie($this->cookieName, $this->sessId, $this->sessExpireTime, "/", '');
$_SESSION = array();
$this->_writeFile();
} else {
$this->sessId = $sessId;
$_SESSION = unserialize($this->_getFile($sessId));
}
}
/**
* 判断某个Session变量是否注册
*
* @param string $varName -
* @return bool 存在返回true, 不存在返回false
*/
function is_registered($varName){
if (!isset($_SESSION[$varName])){
return false;
}
return true;
}
/**
* 注册一个Session变量
*
* @param string $varName - 需要注册成Session的变量名
* @param mixed $varValue - 注册成Session变量的值
* @return bool - 该变量名已经存在返回false, 注册成功返回true
*/
function register($varName, $varValue){
if (isset($_SESSION[$varName])){
return false;
}
$_SESSION[$varName] = $varValue;
$this->_writeFile();
return true;
}
/**
* 销毁一个已注册的Session变量
*
* @param string $varName - 需要销毁的Session变量名
* @return bool 销毁成功返回true
*/
function unregister($varName){
unset($_SESSION[$varName]);
$this->_writeFile();
return true;
}
/**
* 销毁所有已经注册的Session变量
*
* @return 销毁成功返回true
*/
function destroy(){
$_SESSION = array();
$this->_writeFile();
return true;
}
/**
* 获取一个已注册的Session变量值
*
* @param string $varName - Session变量的名称
* @return mixed - 不存在的变量返回false, 存在变量返回变量值
*/
function get($varName){
if (!isset($_SESSION[$varName])){
return false;
}
return $_SESSION[$varName];
}
/**
* 获取所有Session变量
*
* @return array - 返回所有已注册的Session变量值
*/
function getAll(){
return $_SESSION;
}
/**
* 获取当前的Session ID
*
* @return string 获取的SessionID
*/
function getSid(){
return $this->sessId;
}
/**
* 获取服务器端保存的Session数据的路径
*
* @return string 保存Session的路径
*/
function getSavePath(){
return $this->sessSavePath;
}
/**
* 设置保存Session数据的路径
*
* @param string $savePath - 需要保存Session数据的绝对路径
*/
function setSavePath($savePath){
$this->sessSavePath = $savePath;
}
//-------------------------
// 内部接口
//-------------------------
/**
* 生成一个Session ID
*
* @return string 返回一个32位的Session ID
*/
function _getId(){
return md5(uniqid(microtime()));
}
/**
* 检查保存Session数据的路径是否存在
*
* @return bool 成功返回true
*/
function _checkSavePath(){
if (file_exists($this->sessSavePath)){
return true;
}
if (!$this->isCreatePath){
return false;
}
if (!@mkdir($this->sessSavePath)){
$this->_showMessage('Failed: Session cache path '. $this->sessSavePath .'is not exists, create failed');
}
@chmod($this->sessSavePath, 0777);
return true;
}
/**
* 获取Session文件中的数据
*
* @param string $sessId - 需要获取Session数据的SessionId
* @return unknown
*/
function _getFile($sessId = ''){
$sessId = ($sessId == '') ? $this->sessId : $sessId;
$sessFile = $this->sessSavePath . $this->sessFilePrefix . $sessId;
if (!file_exists($sessFile)){
$this->_showMessage('Failed: Session file '. $sessFile .' not exists');
}
return file_get_contents($sessFile);
}
/**
* 把当前的Session数据写入到数据文件
*
* @param string $sessId - Session ID
* @return 成功返回true
*/
function _writeFile($sessId = ''){
$sessId = ($sessId == '') ? $this->sessId : $sessId;
$sessFile = $this->sessSavePath . $this->sessFilePrefix . $sessId;
$sessStr = serialize($_SESSION);
if (!$fp = @fopen($sessFile, "w+")){
$this->_showMessage('Failed: Open session save file '. $sessFile .' failed');
}
if (!@fwrite($fp, $sessStr)){
$this->_showMessage('Failed: Write session data to '. $sessFile .' failed');
}
@fclose($fp);
return true;
}
/**
* 显示提示信息
*
* @param string $strMessage - 需要显示的信息内容
* @param bool $isFailed - 是否是失败信息, 缺省是true
*/
function _showMessage($strMessage, $isFailed = true){
if ($isFailed){
exit($strMessage);
}
echo $strMessage;
}
}
?>
//=======================================
// 程序:File-Based Session Class
// 功能:基于文件存储的 Session 功能类
// 作者: heiyeluren
// 博客: http://blog.csdn.net/heiyeshuwu
// 时间: 2006-12-22
//=======================================
/**
* 类名: FileSession Class
* 功能: 自主实现基于文件存储的 Session 功能
* 描述: 这个类就是实现Session的功能, 基本上是通过设置客户端的Cookie来保存SessionID,
* 然后把用户的数据保存在服务器端,最后通过Cookie中的Session Id来确定一个数据是否是用户的,
* 然后进行相应的数据操作, 目前的缺点是没有垃圾收集功能
*
* 本方式适合保存在普通文件、共享内存(SHM)、NFS服务器等基于文件存储的方式,推荐保存在共享
* 内存当中,因为共享内存存取效率比较高,但是空间比较小,重启后就销毁了
*/
class FileSession
{
var $sessId = '';
var $sessSavePath = '/tmp/';
var $isCreatePath = true;
var $sessExpireTime = '';
var $sessFilePrefix = 'sess_';
var $cookieName = '__SessHandler';
/**
* 构造函数
*
* @param bool $isInit - 是否实例化对象的时候启动Session
*/
function FileSession($isInit = false){
if ($isInit){
$this->start();
}
}
//-------------------------
// 外部方法
//-------------------------
/**
* 启动Session操作
*
* @param int $expireTime - Session失效时间,缺省是0,当浏览器关闭的时候失效, 该值单位是秒
*/
function start($expireTime = 0){
$sessId = $_COOKIE[$this->cookieName];
if (!$sessId){
if (!$this->_checkSavePath()){
$this->_showMessage('Session save path '. $this->sessSavePath .' not or create path failed');
}
$this->sessId = $this->_getId();
$this->sessExpireTime = ($expireTime > 0) ? time() + $expireTime : 0;
setcookie($this->cookieName, $this->sessId, $this->sessExpireTime, "/", '');
$_SESSION = array();
$this->_writeFile();
} else {
$this->sessId = $sessId;
$_SESSION = unserialize($this->_getFile($sessId));
}
}
/**
* 判断某个Session变量是否注册
*
* @param string $varName -
* @return bool 存在返回true, 不存在返回false
*/
function is_registered($varName){
if (!isset($_SESSION[$varName])){
return false;
}
return true;
}
/**
* 注册一个Session变量
*
* @param string $varName - 需要注册成Session的变量名
* @param mixed $varValue - 注册成Session变量的值
* @return bool - 该变量名已经存在返回false, 注册成功返回true
*/
function register($varName, $varValue){
if (isset($_SESSION[$varName])){
return false;
}
$_SESSION[$varName] = $varValue;
$this->_writeFile();
return true;
}
/**
* 销毁一个已注册的Session变量
*
* @param string $varName - 需要销毁的Session变量名
* @return bool 销毁成功返回true
*/
function unregister($varName){
unset($_SESSION[$varName]);
$this->_writeFile();
return true;
}
/**
* 销毁所有已经注册的Session变量
*
* @return 销毁成功返回true
*/
function destroy(){
$_SESSION = array();
$this->_writeFile();
return true;
}
/**
* 获取一个已注册的Session变量值
*
* @param string $varName - Session变量的名称
* @return mixed - 不存在的变量返回false, 存在变量返回变量值
*/
function get($varName){
if (!isset($_SESSION[$varName])){
return false;
}
return $_SESSION[$varName];
}
/**
* 获取所有Session变量
*
* @return array - 返回所有已注册的Session变量值
*/
function getAll(){
return $_SESSION;
}
/**
* 获取当前的Session ID
*
* @return string 获取的SessionID
*/
function getSid(){
return $this->sessId;
}
/**
* 获取服务器端保存的Session数据的路径
*
* @return string 保存Session的路径
*/
function getSavePath(){
return $this->sessSavePath;
}
/**
* 设置保存Session数据的路径
*
* @param string $savePath - 需要保存Session数据的绝对路径
*/
function setSavePath($savePath){
$this->sessSavePath = $savePath;
}
//-------------------------
// 内部接口
//-------------------------
/**
* 生成一个Session ID
*
* @return string 返回一个32位的Session ID
*/
function _getId(){
return md5(uniqid(microtime()));
}
/**
* 检查保存Session数据的路径是否存在
*
* @return bool 成功返回true
*/
function _checkSavePath(){
if (file_exists($this->sessSavePath)){
return true;
}
if (!$this->isCreatePath){
return false;
}
if (!@mkdir($this->sessSavePath)){
$this->_showMessage('Failed: Session cache path '. $this->sessSavePath .'is not exists, create failed');
}
@chmod($this->sessSavePath, 0777);
return true;
}
/**
* 获取Session文件中的数据
*
* @param string $sessId - 需要获取Session数据的SessionId
* @return unknown
*/
function _getFile($sessId = ''){
$sessId = ($sessId == '') ? $this->sessId : $sessId;
$sessFile = $this->sessSavePath . $this->sessFilePrefix . $sessId;
if (!file_exists($sessFile)){
$this->_showMessage('Failed: Session file '. $sessFile .' not exists');
}
return file_get_contents($sessFile);
}
/**
* 把当前的Session数据写入到数据文件
*
* @param string $sessId - Session ID
* @return 成功返回true
*/
function _writeFile($sessId = ''){
$sessId = ($sessId == '') ? $this->sessId : $sessId;
$sessFile = $this->sessSavePath . $this->sessFilePrefix . $sessId;
$sessStr = serialize($_SESSION);
if (!$fp = @fopen($sessFile, "w+")){
$this->_showMessage('Failed: Open session save file '. $sessFile .' failed');
}
if (!@fwrite($fp, $sessStr)){
$this->_showMessage('Failed: Write session data to '. $sessFile .' failed');
}
@fclose($fp);
return true;
}
/**
* 显示提示信息
*
* @param string $strMessage - 需要显示的信息内容
* @param bool $isFailed - 是否是失败信息, 缺省是true
*/
function _showMessage($strMessage, $isFailed = true){
if ($isFailed){
exit($strMessage);
}
echo $strMessage;
}
}
?>
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章
如何修復KB5055523無法在Windows 11中安裝?
4 週前ByDDD
如何修復KB5055518無法在Windows 10中安裝?
4 週前ByDDD
<🎜>:種植花園 - 完整的突變指南
2 週前ByDDD
<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前By尊渡假赌尊渡假赌尊渡假赌
如何修復KB5055612無法在Windows 10中安裝?
3 週前ByDDD

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3漢化版
中文版,非常好用

Dreamweaver Mac版
視覺化網頁開發工具

禪工作室 13.0.1
強大的PHP整合開發環境