仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1298|回复: 19
打印 上一主题 下一主题

[学习教程] PHP教程之完成基于文件存储的Session类

[复制链接]
若天明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:13:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我的这套线路可能跟许多学习PHP的爱好者不谋而合,这也算是一个循序渐进的学习过程,不过新手不要看到上面的概括就以为学习蛮简单的,默默在此不得不对您稍微泼一下冷水,任何东西其实都不简单。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;
    }   
}
?>

既然选择了PHP,就要坚持学下去!大家有没有问自己为什么会选择学习PHP呢?就我个人而言,完全是因为兴趣,因为我的专业和计算机完全无关,但是就是对编程很赶兴趣,尤其对网络编程、web开发特别赶兴趣。
沙发
发表于 2015-2-4 09:58:15 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
简单生活 该用户已被删除
板凳
发表于 2015-2-6 19:08:33 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
第二个灵魂 该用户已被删除
地板
发表于 2015-2-18 06:20:37 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
海妖 该用户已被删除
5#
发表于 2015-3-7 04:33:38 | 只看该作者
当然这种网站的会员费就几十块钱。
因胸联盟 该用户已被删除
6#
发表于 2015-3-14 10:24:27 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
小女巫 该用户已被删除
7#
发表于 2015-3-15 14:47:28 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
深爱那片海 该用户已被删除
8#
发表于 2015-3-22 01:18:51 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
再现理想 该用户已被删除
9#
发表于 2015-3-22 03:09:13 | 只看该作者
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
金色的骷髅 该用户已被删除
10#
发表于 2015-3-25 15:47:29 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
灵魂腐蚀 该用户已被删除
11#
发表于 2015-3-27 13:11:09 | 只看该作者
做为1门年轻的语言,php一直很努力。
老尸 该用户已被删除
12#
发表于 2015-3-29 02:06:51 | 只看该作者
爱上php,他也会爱上你。
只想知道 该用户已被删除
13#
发表于 2015-4-25 06:17:46 | 只看该作者
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
冷月葬花魂 该用户已被删除
14#
发表于 2015-4-26 18:22:36 | 只看该作者
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
变相怪杰 该用户已被删除
15#
发表于 2015-5-1 14:09:32 | 只看该作者
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
蒙在股里 该用户已被删除
16#
发表于 2015-5-8 18:32:47 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
飘飘悠悠 该用户已被删除
17#
发表于 2015-6-24 16:09:38 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
透明 该用户已被删除
18#
发表于 2015-6-29 21:53:26 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
山那边是海 该用户已被删除
19#
发表于 2015-7-1 11:00:24 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
不帅 该用户已被删除
20#
发表于 2015-7-4 11:00:45 | 只看该作者
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 21:46

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表