• ----:)欢迎访问源码网(:----
    • 首页
    • 博客
    • 学院
    • 下载
    • 论坛
    • 影视
    • 发布源码
    • RSS
    • ITPig
    • 笑话网
    • 百家姓
    • 繁體中文

源码网 - 中国第一源码门户
选择镜像:网通镜像 - 电信主站
  • 首 页
  • 新闻动态
  • 网站运营
  • 网页制作
  • WEB开发
  • 编程开发
  • 图像媒体
  • 操作系统
  • 数据库
  • 服务器
热门搜索 优化 SEO 故事 cms IIS7 MySQL 个人 AdSense 主题推广 | 文章搜索: 高级搜索
会员登录/控制面版您的位置: 学院首页 >> WEB开发 >> PHP 开发 >> PHP精通 >> 详细内容
 

推荐文章

  • PHP 程序加速探索
  • 用封装类来合理的设计PHP项目--谈PHP项目中类的封装
 
 

热点文章

  • 30分钟学会用PHP写带数据库的简单通讯录
  • 结合AJAX进行PHP开发之入门
  • 最强的PHP字符串截取函数
  • 汉字编码问题
  • PHP向脚本提交POST数据
  • 中文字符集与字符编码的基础知识
  • PHP实现验证码一法
  • php模板smarty
  • php如何隐藏图片的真实地址
  • PHP 程序加速探索
  • php防盗链的方法
  • 用封装类来合理的设计PHP项目--谈PHP项目中类的封装
 
 

相关文章

  • PHP使用zlib扩展实现页面GZIP压缩输出
  • 为什么PHP令人不爽(对于大型系统)
  • php中的stdClass
  • php中ADODB类使用
  • php自动post数据--百度贴吧灌水机器人代码实例
  • Linux/FreeBSD下用C语言开发PHP的so扩展模块例解
  • php取不到session的常见原因
  • 使用php的zlib压缩和解压缩swf文件
  • php 做服务器端程序
  • PHP5.2下function和class性能对比
  • PHP用mkdir()新建立目录无写的权限的问题
  • mysql的bigint类型与php的mysql_insert_id函数造成的b..
 
 

百度搜索

 
 

PHP大型Web应用入门(八)

  • 阅览次数:
  • 文章来源: http://goodlinuxer.bokee.com/
  • 原文作者: 静水人生
  • 整理日期: 2008-07-28
  • 发表评论
  • 字体大小:
  • 小
  • 中
  • 大

下面的部分是mSession的实现,它只是模拟了session的存取过程,并对系统session进行了改进。它用了Hash目录。它的缺点是在程序结束部分还要Rewrite一下,把数据更新到session文件里,当然这个很容易被改进。

<?php
classBsmSession
{
var
$sid;
var
$sess_file;

function
mSession_Start()
{
//SpecialFunction...session_start()
global$cookie_sess_id_varname,$cookie_path,$sess_liftime,$mSession;

$sid=$_COOKIE[$cookie_sess_id_varname]?$_COOKIE[$cookie_sess_id_varname]:$this->_Gen_Sid();
setcookie($cookie_sess_id_varname,$sid,$sess_liftime,$cookie_path);

$sess_file=$this->_Hash_Dir($sid).'sess_'.$sid;

if(
file_exists($sess_file)){
if(!@
$fp=fopen($sess_file,'rb')){
//DebugInfo...NoLog.
fatal_error('SessionError...');
}

if(
0==($fl=filesize($sess_file)))
$sess_content='';

else
$sess_content=fread($fp,$fl);
}
else{
if(!@
$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=array();
}

function
mSession_Destroy()
{
global
$mSession;

$mSession=array();
return@
unlink($this->sess_file);
}

function
mSession_Rewrite()
{
//RestoreSessionDataintoSessionFile
global$mSession;

$sess_content=serialize($mSession);

if(!@
$fp=fopen($this->sess_file,'wb')){
//DebugInfo...NoLog.
fatal_error('SessionError...');
}

fwrite($fp,$sess_content);
fclose($fp);

return;
}

function
_Hash_Dir($sid)
{
//HashtheSessionfileDir

global$user_sess_base_dir;

$sess_dir=$user_sess_base_dir.substr($sid,0,1).'/'.substr($sid,16,1).'/';
return
$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);

return
$sid;
}

function
_Get_Sid()
{
//GetCurrentSessionID
global$cookie_sess_id_varname;

$sid=$_COOKIE[$cookie_sess_id_varname]?$_COOKIE[$cookie_sess_id_varname]:FALSE;
return
$sid;
}
}
?>
Hash目录是一种优化文件存储性能的方法。无论是Windows还是Linux,无论是NTFS还是ext3,每个目录下所能容纳的项目数是有限的。并不是不能保存,而是当项目数量过大的时候,会降低文件索引速度,所以权衡一个目录下应该保存多少文件是很必要的。保存得多了会影响性能,保存得少了会造成目录太多和空间浪费。所以当保存大批文件的时候,需要有一种算法能将文件比较均匀地“打散”在不同的子目录下以提高每一级的索引速度,这种算法就是Hash。通常用的MD5、sha1等都可以用来做Hash目录,我的mSession里也同样使用了MD5,取得sessionID的第一位和第九位,这就构成了两级Hash路径,也就是说,系统把所有的Session文件分散到了16×16=256个子目录下。假设Linux每个目录下保存1000个文件可以获得最好的空间性能比,那么系统在理想情况下可以同时有256000个session文件在被使用。
Hash目录还被广泛应用在备份、图库、电子邮件、静态页生成等文件密集型应用上。

再来点一下我的模板类,我很懒地保留了Discuz模板函数的所有标签。一方面是我确实很懒,另一方面是我曾经试图修改Discuz,把它改成一个专用的版本,不过这是一个类,它的使用方法和Discuz函数没什么两样,都是include一个parse结果返回的文件名。
所不同的是在处理{template}标签的时候。Discuz的处理方式是把{template}替换成再次调用模板解析函数去解析另一个模板文件,这样,模板函数可能会被调用多次,编译的结果里也会有很多include另一个模板文件Parse结果的地方。这里涉及另一个优化点——尽量少地include文件。过多地include会带来更多的IO开销和CPU处理开销,所以我把{template}改成直接读入文件内容,然后再parse。这样一个模板文件即使有1000个{template},编译的结果也只有一个文件。

上一篇:PHP使用zlib扩展实现页面GZIP压缩输出
下一篇:构建支持Master/Slave读写分离的数据库操作类
  • 网友评论:
  • 查看所有评论
  • 我要发表评论
您的网名:
留言主题:
你要发表的内容:

 

关于本站 | 广告联系 | 版权声明 | 网站地图 | 发布软件 | 帮助中心 | 源码论坛

Copyright © 2005-2007 CodePub.Com  程序支持:木翼  滇ICP备05005971号