* * * * * *
主要就是这些东西支撑起一个系统运行的必要部分。我从来不强调MVC层次,也不去讲究OOP,虽然偶尔也写一些很蹩脚的类。多年以来Pascal、C和汇编养成的习惯使我相比注意OO结构之外更注意执行效率。这次只是罗列了一些基于共享内存和tmpfs的优化方法。
至于把什么样的数据放在tmpfs上,各位自己看着办。我把include文件、session、模板的编译结果、cache文件放在了上面。在提升IO性能的同时,它带来的另一个好处是不需要把这些文件放在web目录里,也提高了不少安全性。即使有一些文件需要放在web目录下,比如程序执行文件(废话……),也不要用奇怪的扩展名。对于config.inc.php这样的文件尤其要注意,不要使用config.inc这种文件名,很有可能你的系统忘了配置对.inc的支持,访问者可以直接在浏览器里访问config.inc就可以把这个文件下载走了,而这个文件里保存着你的数据库密码……
走到这里,我们已经逐渐地跟上了优化的步伐,在后面的时间里,优化程序结构的同时,已经可以做好更输入地挖掘系统潜力的的准备了。将优化进行到底,挑战一下一台服务器到底能撑住多少个访问者是我近期的变态目标。不过再走下去,可能已经走出了PHP的领地,各位一定要有心理准备,因为我的C程序写得有时候比天书还乱…………hoho
附上那个压缩/解压的类:
<?php
classBsmPkg
{
//ThisclassoperateswithPKGarchiveformat...Haha
//ByDr.NP02-15-2006
var$classname='BsmPkg';
var$source_dir='';
var$target_dir='';
var$filename='';
var$max_filesize=1048576;
var$error_msg='';
var$line_ret="n";
functionpack_from_dir()
{
ini_set('memory_limit','32M');
global$content;
$source_dir=$this->source_dir?$this->source_dir:'./';
$content='<==PACKAGE_START==>'.$this->line_ret;
$this->_GetDirs($source_dir);
$content.='<==PACKAGE_END==>';
$zfp=gzopen($this->filename,'wb9');
gzwrite($zfp,$content);
gzclose($zfp);
return;
}
functionunpack_into_dir()
{
ini_set('memory_limit','32M');
$target_dir=$this->target_dir?$this->target_dir:'./';
$zfp=gzopen($this->filename,'rb');
$content=gzread($zfp,$this->max_filesize);
gzclose($zfp);
$lines=explode($this->line_ret,$content);
while(list($key,$line)=each($lines)){
if(preg_match("/<==Directory:([0-7]+)==>(S+)<==/Directory==>/is",$line,$march)){
$access_str=$march[1];
$item_dir=$march[2];
if(!is_dir($target_dir.$item_dir)){
mkdir($target_dir.$item_dir);
@chmod($target_dir.$item_dir,intval($access_str,8));
}
}
if(preg_match("/<==File:(d+)-([0-9a-f]+)-([0-7]+)==>(S+)<==/File==>/is",$line,$march)){
$target_file=$march[4];
$access_str=$march[3];
$target_file_checksum=$march[2];
$target_filesize=$march[1];
if(!@$fp=fopen($target_dir.$target_file,'wb')){
continue;
}
if(false===(list($key,$content)=each($lines))){
continue;
}
$file_content=base64_decode(trim($content));
if(!@fwrite($fp,$file_content)){
continue;
}
fclose($fp);
if(!@md5_file($target_file)==$target_file_checksum){
$this->error_msg='File:'.$target_dir.$target_file.'CheckSumFailed...';
}
@chmod($target_dir.$target_file,intval($access_str,8));
}
}
return;
}
function_GetDirs($dirname)
{
global$content;
$dh=opendir($dirname);
while(false!==($item=readdir($dh))){
$full_itemname=str_replace('//','/',$dirname.'/'.$item);
if(strpos($full_itemname,$this->source_dir)===0)
$pkg_itemname=substr($full_itemname,strlen($this->source_dir));
else
continue;
if($item!='.'&&$item!='..'&&$item!=$this->filename){
if(is_dir($full_itemname)){
$access_str=substr(decoct(fileperms($full_itemname)),-4);
$content.="<==Directory:{$access_str}==>$pkg_itemname<==/Directory==>{$this->line_ret}";
$this->_GetDirs($full_itemname);
}
elseif(is_file($full_itemname)&&is_readable($full_itemname)){
$filesize=filesize($full_itemname);
$checksum=md5_file($full_itemname);
$access_str=substr(decoct(fileperms($full_itemname)),-4);
$content.="<==File:{$filesize}-{$checksum}-{$access_str}==>$pkg_itemname<==/File==>{$this->line_ret}";
@$fp=fopen($full_itemname,'rb');
if($filesize>0)
$source_file_str=fread($fp,$filesize);
else
$source_file_str='';
$base64_str=base64_encode($source_file_str);
fclose($fp);
$content.=$base64_str.$this->line_ret;
}
}
}
return;
}
}
?>
classBsmPkg
{
//ThisclassoperateswithPKGarchiveformat...Haha
//ByDr.NP02-15-2006
var$classname='BsmPkg';
var$source_dir='';
var$target_dir='';
var$filename='';
var$max_filesize=1048576;
var$error_msg='';
var$line_ret="n";
functionpack_from_dir()
{
ini_set('memory_limit','32M');
global$content;
$source_dir=$this->source_dir?$this->source_dir:'./';
$content='<==PACKAGE_START==>'.$this->line_ret;
$this->_GetDirs($source_dir);
$content.='<==PACKAGE_END==>';
$zfp=gzopen($this->filename,'wb9');
gzwrite($zfp,$content);
gzclose($zfp);
return;
}
functionunpack_into_dir()
{
ini_set('memory_limit','32M');
$target_dir=$this->target_dir?$this->target_dir:'./';
$zfp=gzopen($this->filename,'rb');
$content=gzread($zfp,$this->max_filesize);
gzclose($zfp);
$lines=explode($this->line_ret,$content);
while(list($key,$line)=each($lines)){
if(preg_match("/<==Directory:([0-7]+)==>(S+)<==/Directory==>/is",$line,$march)){
$access_str=$march[1];
$item_dir=$march[2];
if(!is_dir($target_dir.$item_dir)){
mkdir($target_dir.$item_dir);
@chmod($target_dir.$item_dir,intval($access_str,8));
}
}
if(preg_match("/<==File:(d+)-([0-9a-f]+)-([0-7]+)==>(S+)<==/File==>/is",$line,$march)){
$target_file=$march[4];
$access_str=$march[3];
$target_file_checksum=$march[2];
$target_filesize=$march[1];
if(!@$fp=fopen($target_dir.$target_file,'wb')){
continue;
}
if(false===(list($key,$content)=each($lines))){
continue;
}
$file_content=base64_decode(trim($content));
if(!@fwrite($fp,$file_content)){
continue;
}
fclose($fp);
if(!@md5_file($target_file)==$target_file_checksum){
$this->error_msg='File:'.$target_dir.$target_file.'CheckSumFailed...';
}
@chmod($target_dir.$target_file,intval($access_str,8));
}
}
return;
}
function_GetDirs($dirname)
{
global$content;
$dh=opendir($dirname);
while(false!==($item=readdir($dh))){
$full_itemname=str_replace('//','/',$dirname.'/'.$item);
if(strpos($full_itemname,$this->source_dir)===0)
$pkg_itemname=substr($full_itemname,strlen($this->source_dir));
else
continue;
if($item!='.'&&$item!='..'&&$item!=$this->filename){
if(is_dir($full_itemname)){
$access_str=substr(decoct(fileperms($full_itemname)),-4);
$content.="<==Directory:{$access_str}==>$pkg_itemname<==/Directory==>{$this->line_ret}";
$this->_GetDirs($full_itemname);
}
elseif(is_file($full_itemname)&&is_readable($full_itemname)){
$filesize=filesize($full_itemname);
$checksum=md5_file($full_itemname);
$access_str=substr(decoct(fileperms($full_itemname)),-4);
$content.="<==File:{$filesize}-{$checksum}-{$access_str}==>$pkg_itemname<==/File==>{$this->line_ret}";
@$fp=fopen($full_itemname,'rb');
if($filesize>0)
$source_file_str=fread($fp,$filesize);
else
$source_file_str='';
$base64_str=base64_encode($source_file_str);
fclose($fp);
$content.=$base64_str.$this->line_ret;
}
}
}
return;
}
}
?>
