创建日志类:log.class.php
作用:信息记录到日志中
开发思路:给定内容,写入到文件 利用fopen() fwrite(),如果文件大于1M,重新写一份
统一放到 ./data/log 目录中
传给日志的内容,判断日志的大小,如果大于1M,备份,
否则,写入
功能:
1 write()写日志;
2 bak() 备份日志
3 isbak() 读取并判断日志大小
<?php /**** 记录信息到日志 给定内容->写入文件->文件大于1M->重写一份 需要判断当前日志大小-->大于1M备份-->重新存储 |-->写入 ****/ class log{ //创建一个常量,日志文件的大小 const LOGFILE = "curr.log"; // define //写日志 public static function write($cont){ $cont .= "\r\n";//追加换行符号 //计算出日志文件地址,往里写内容 $log = self::isBak();//判断是否备份,操作完成 $handle = fopen($log, "ab");//打开文件,返回一个文件句柄 fwrite($handle, $cont);//写入内容 fclose($handle);//关闭文件句柄 } //备份日志 public static function bck(){ //把原来的日志文件,改个名,存储起来。 //改成年月日.bck $log = ROOT."data/log/".self::LOGFILE; //mt_rand() — 生成更好的随机数 $bck = ROOT."data/log/".date("ymd").mt_rand(1000,9999).".bck"; //rename重新命名一个文件或目录 return rename($log, $bck); } //读取并判断日志的大小、 public static function isBak(){ $log = ROOT."data/log/".self::LOGFILE; //得到当前路径, if (!file_exists($log)) {//判断目录是否存在 touch($log); //linux下快速创建文件命令 //如果文件不存在,则会被创建。 return $log; //返回路径 } //存在判断大小 /* 先要清除缓存,因为缓存了结果,导致判断大小,始终是大于1M的 */ clearstatcache();//清除文件缓存 $size = filesize($log); //获取文件大小 if ($size<=1024*1024) { //如果文件大小,小于1M return $log; //返回文件按路径 } //大于1M if (!self::bck()) { //调用自身的bck方法,备份 return $log; //备份失败,返回路径,继续写入 } else //备份成功,原来的日志文件不存在了,重新创建日志文件, { touch($log); return $log; //返回文件路径 } } } ?> |
Log类测试:
//log::write("记录"); 简单测试 class mysql{ public function query($sql){ log::write($sql); } } $my= new mysql(); for($i=0;$i<10000;$i++){ $sql = "select goods_id,good_name from goods where good_id ,good_nam ,good_name from goods where good_id= ".mt_rand(1,1000); $my->query($sql); usleep(10000); //usleep — 以指定的微秒数延迟执行 //sleep — 延缓执行 以秒为单位 } |
文件备份的改进:
文件已经大于1M,还是持续写入到日志文件中,
下次必须刷新,才能备份,
在php.exe开启进程,进行5000次读取,结束进程
在一次进程中,filesize的结果都会被缓存,
很多文件按信息读取函数结果都会被缓存,如filemtime()
for($file=‘/a.txt‘,$i=1;$i<100;$i++){ echo filesize($file).‘<br/>‘; $handle = fopen($file, ‘ab‘); fwrite($handle, $i."\r\n"); fclose($handle); } |
第一次读取到的size都是零,即使这个过程中文件的内容已经修改了
再次刷新时,filesize读出已经变成1M以上,
将备份文件,并新建文件,同时写入到其中
即使日志文件已经被重命名了,filesize还是被缓存了,循环5000次,
还是认为文件大小始终大于1M,始终备份
Clearstatcache()函数 — 清除文件状态缓存
本函数缓存特定文件名的信息,因此只在对同一个文件名进行多次操作并且需要该文件信息不被缓存时才需要调用 clearstatcache()。
受影响的函数包括 stat() , lstat() , file_exists() , is_writable() , is_readable() , is_executable() , is_file() , is_dir() , is_link() , filectime() , fileatime() , filemtime() , fileinode() , filegroup() , fileowner() , filesize() , filetype() 和 fileperms() 。
本文出自 “杜国栋个人PHP学习博文” 博客,请务必保留此出处http://duguodong.blog.51cto.com/7667978/1386383
时间:2014年3月28日15:51:27框架改进 增加日志功能log类,布布扣,bubuko.com
时间:2014年3月28日15:51:27框架改进 增加日志功能log类
原文:http://duguodong.blog.51cto.com/7667978/1386383