专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »PHP教程 » php入门:PHP大型Web应用入门( 8) »正文

php入门:PHP大型Web应用入门( 8)

来源: 发布时间:星期一, 2009年1月12日 浏览:9次 评论:0
  下面部分是mSession实现它只是模拟了session存取过程并对系统session进行了改进它用了Hash目录缺点是在结束部分还要Rewrite把数据更新到session文件里当然这个很容易被改进

<?php
BsmSession
{
var$sid;
var$sess_file;
  
functionmSession_Start
{
//SpecialFunction...session_start
global$cookie_sess_id_varname,$cookie_path,$sess_ltime,$mSession;
  
$sid=$_COOKIE[$cookie_sess_id_varname]?$_COOKIE[$cookie_sess_id_varname]:$this->_Gen_Sid;
cookie($cookie_sess_id_varname,$sid,$sess_ltime,$cookie_path);
  
$sess_file=$this->_Hash_Dir($sid).'sess_'.$sid;
  
(file_exists($sess_file)){
(!@$fp=fopen($sess_file,'rb')){
//DebugInfo...NoLog.
fatal_error('SessionError...');
}
  
(0($fl=filesize($sess_file)))
$sess_content='';
  

$sess_content=fread($fp,$fl);
}
{
(!@$fp=fopen($sess_file,'wb')){
//DebugInfo...NoLog.
fatal_error('SessionError...');
}
  
$sess_content='';
}
  
fclose($fp);
  
$this->sid=$sid;
$this->sess_file=$sess_file;
  
$mSession=unserialize($sess_content)or$mSession=.gif' />;
}
  
functionmSession_Destroy
{
global$mSession;
  
$mSession=.gif' />;
@unlink($this->sess_file);
}
  
functionmSession_Rewrite
{
//RestoreSessionDataoSessionFile
global$mSession;
  
$sess_content=serialize($mSession);
  
(!@$fp=fopen($this->sess_file,'wb')){
//DebugInfo...NoLog.
fatal_error('SessionError...');
}
  
fwrite($fp,$sess_content);
fclose($fp);
  
;
}
  
function_Hash_Dir($sid)
{
//HashtheSessionfileDir
  
global$user_sess_base_dir;
  
$sess_dir=$user_sess_base_dir.substr($sid,0,1).'/'.substr($sid,16,1).'/';
$sess_dir;
}
  
function_Gen_Sid
{
//GenanUniqueSessionID
  
$key_1=rand(32768,65535);
$key_2=microtime;
$key_3=sha1(time);
  
$sid=md5($key_1.$key_3.$key_2);
  
$sid;
}
  
function_Get_Sid
{
//GetCurrentSessionID
global$cookie_sess_id_varname;
  
$sid=$_COOKIE[$cookie_sess_id_varname]?$_COOKIE[$cookie_sess_id_varname]:FALSE;
$sid;
}
}
?>


  Hash目录是种优化文件存储性能思路方法无论是Windows还是Linux无论是NTFS还是ext3每个目录下所能容纳项目数是有限并不是不能保存而是当项目数量过大时候会降低文件索引速度所以权衡个目录下应该保存多少文件是很必要保存得多了会影响性能保存得少了会造成目录太多和空间浪费所以当保存大批文件时候需要有种算法能将文件比较均匀地“打散”在区别子目录下以提高每索引速度这种算法就是Hash通常用MD5、sha1等都可以用来做Hash目录mSession里也同样使用了MD5取得sessionID位和第 9位这就构成了两级Hash路径也就是说系统把所有Session文件分散到了16×16=256个子目录下假设Linux每个目录下保存1000个文件可以获得最好空间性能比那么系统在理想情况下可以同时有256000个session文件在被使用

  Hash目录还被广泛应用在备份、图库、电子邮件、静态页生成等文件密集型应用上

  再来点下我模板类我很懒地保留了Discuz模板所有标签方面是我确实很懒方面是我曾经试图修改Discuz把它改成个专用版本不过这是个类使用思路方法和Discuz没什么两样都是个parse结果返回文件名

  所区别是在处理{template}标签时候Discuz处理方式是把{template}替换成再次模板解析去解析另个模板文件这样模板可能会被多次编译结果里也会有很多个模板文件Parse结果地方这里涉及另个优化点——尽量少地文件过多地会带来更多IO开销和CPU处理开销所以我把{template}改成直接读入文件内容然后再parse这样个模板文件即使有1000个{template}编译结果也只有个文件

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: