PHP监控服务器文件目录

网络整理 - 08-10
目录监控的实现原理是记录被监控目录(包含子目录)下的文件的MD5值,并保存Log,当第二次重新扫描该目录的时候,与上一次的LOG进行比较,从而获知文件的“新增”、“编辑”、“删除”等情况。

  注意事项:

  1、md5_file在处理大文件的时候效率不高,因此如果目录中存在较大文件,请自行加入一个忽略选项,将该文件忽略,否则会影响执行时间。

  2、如果您使用的是Linux服务器,那么请自行建立相应的Log文件,并设置权限为可写。

  完整的代码如下:

<?php
/**
*
*  目录监控
*
*  @author 郭瑞超 (grc1988#gmail.com)
*  @date 2009-04-15
*  @license BSD
*  @package common
*  @version 0.0.1 
*
**/
set_time_limit(0);
define('M_PATH','.');  //设置监控的目录,当前目录为'.',上一级目录为'..',也可以设置绝对路径,后面不要加斜杠
define('M_LOG','../m.log');  //设置存储log的路径,可以放置在任意位置
$file_list = array();
function record_md5($dir){
        global $file_list;
        if(is_dir($dir)){
                $file=scandir($dir);
                foreach($file as $f){
                        if($f!='.' && $f!='..'){
                                $path = $dir.'/'.$f;
                                if(is_dir($path)){
                                        record_md5($path);
                                }else{
                                        $file_list[$path]=md5_file($path);
                                }
                        }
                }
        }
}
record_md5(M_PATH);
if(file_exists(M_LOG)){
        $log = unserialize(file_get_contents(M_LOG));
}else{
        $log = array();
}
file_put_contents(M_LOG,serialize($file_list));
if(count($file_list) > 0 ){
        foreach($file_list as $file => $md5){
                if(!isset($log[$file])){
                        print '新增:'.$file.'<br />';
                }else{
                        if($log[$file] != $md5){
                                print '修改:'.$file."<br />";

                                unset($log[$file])
                        }else{
                                unset($log[$file]);
                        }
                }
        }
}
if(count($log)>0){
        foreach($log as $file => $md5){
        print "删除:".$file."<br />";
        }
}
?>