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