首页 »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} 编译 结果也只有 个文件
相关文章
读者评论
发表评论
|
|