由于php程序中大量用到了session,php的session的采用默认的形式保存到/tmp中,服务器出现莫名的错误,主机bash上(本地上!远程看不到)反复提示类似错误:
killed process 21034(apache2)
out of memory :kill process 1247 (apache2) score 28840 or a child.
出现该问题时,曾用过简单的方法:、
直接把/tmp下 的文件清空,重启就好了。
没想到,没过多长时间,问题又重复出现了,而且是一直在出现,看来要花点工夫解决下了。
分享一个我的解决方法,供大家参考。
1、使用内存来保存session
修改php.ini的配置文件
修改为:
前提是已经安装了:eaccelerator。
2、使用session的分级目录
修改;session.save_path = "/tmp"
修改为:
使用/tmp/session目录下二级散列目录存储session
php不会自动建立散列目录,需要手动创建相应的目录,并给予权限:
/tmp/session/0/1/
/tmp/session/0/3/
tmp/session/0/4/
……………………
3、用自动清理session
/etc/cron.hourly/下新建文件session
如下:
说明:
1小时清理一次,清理大于3个小时的session文件。
我目前采用的第三个方法,效果不错。
第一种大家也可以尝试下,看看效果咱样吧。
哪位朋友,有好的方法,也欢迎分享给,大家共同探讨,呵呵。
检测文件头信息,继而判断文件类型的例子,这个在防范上传不合要求的文件时,很有用的,比通过js判断文件类型的方法,安全多了。
代码如下:
/* 通过文件名,获得文件类型*
* @author chengmo*
* @version 0.1
* $filename="d:/1.png";echo cFileTypeCheck::getFileType($filename); 打印:png
* edit www.
*/
class cFileTypeCheck
{
private static $_TypeList=array();
private static $CheckClass=null;
private function __construct($filename)
{
self::$_TypeList=$this->getTypeList();
}
/**
*处理文件类型映射关系表*
*
* @param string $filename 文件类型
* @return string 文件类型,没有找到返回:other
*/
private function _getFileType($filename)
{
$filetype="other";
if(!file_exists($filename)) throw new Exception("no found file!");
$file = @fopen($filename,"rb");
if(!$file) throw new Exception("file refuse!");
$bin = fread($file, 15); //只读15字节 各个不同文件类型,头信息不一样。
fclose($file);
$typelist=self::$_TypeList;
foreach ($typelist as $v)
{
$blen=strlen(pack("H*",$v[0])); //得到文件头标记字节数
$tbin=substr($bin,0,intval($blen)); ///需要比较文件头长度
if(strtolower()($v[0])==strtolower(array_shift(unpack("H*",$tbin))))
{
return $v[1];
}
}
return $filetype;
}
/**
*得到文件头与文件类型映射表*
*
* @return array array(array(key,value)...)
*/
public function getTypeList()
{
return array(array("FFD8FFE1","jpg"),
array("89504E47","png"),
array("47494638","gif"),
array("49492A00","tif"),
array("424D","bmp"),
array("41433130","dwg"),
array("38425053","psd"),
array("7B5C727466","rtf"),
array("3C3F786D6C","xml"),
array("68746D6C3E","html"),
array("44656C69766572792D646174","eml"),
array("CFAD12FEC5FD746F","dbx"),
array("2142444E","pst"),
array("D0CF11E0","xls/doc"),
array("5374616E64617264204A","mdb"),
array("FF575043","wpd"),
array("252150532D41646F6265","eps/ps"),
array("255044462D312E","pdf"),
array("E3828596","pwl"),
array("504B0304","zip"),
array("52617221","rar"),
array("57415645","wav"),
array("41564920","avi"),
array("2E7261FD","ram"),
array("2E524D46","rm"),
array("000001BA","mpg"),
array("000001B3","mpg"),
array("6D6F6F76","mov"),
array("3026B2758E66CF11","asf"),
array("4D546864","mid"));
}
public static function getFileType($filename)
{
if(!self::$CheckClass) self::$CheckClass=new self($filename);
$class=self::$CheckClass;
return $class->_getFileType($filename);
}
}
?>
substr函数,用于字符串的截取。
substr(str,start,length);
例如:
输出为 is ve;
1,当start>str的长度,则返回为();
substr(php is very good language,4);
输出为 (空白)
输出为is v (表明start和langth都为4)
2,当start为负值,则从str末尾出开始读起(*这时是从-1开始读,而不是从0开始),
输出为uage
3,当length为负值时,length代表的是从末尾开始读,截取str的结束位置。
输出为is very good lan
另外,
explode()()把函数字符串分割为数组;
strrev()把函数字符串
setlocalhost(content location)设置本地环境.content ,指定需要设置的场景信息常量有(
LC_ALL – 所有下属的常量
LC_COLLATE – 排列顺序
LC_CTYPE – 字符分类和转换(例如:将所有的字符转换成小写或大写形式)
LC_MESSAGES – 系统信息格式
LC_MONETARY – 货币 / 通货格式
LC_NUMERIC – 数值格式
LC_TIME – 日期和时间格式
);location,设置国家区域,例如,chs.
strftime()根据区域设置格式化本地时间/日期。
就介绍这些了,希望对大家有所帮助。
学php教程,就来吧。