霜天部落 | 关注LAMP高性能、高并发架构的设计与研究

用php分析APACHE的访问日志

最近找了一段php程序,可以用来分析apache的访问日志,感觉很不错,在此特别贡献出来。

程序:php分析APACHE的访问日志

filename=$filename;
	}
	//该函数为格式转换函数,转化为UNIX时间戳
	function Format2UnixTime ($str)
	{
		$time = $str;
		$time = str_replace("/"," ",$time);
		$time_array = explode( ":",$time,2);
		$time = $time_array[0]." ".$time_array[1];
		return strtotime($time);
	}
	function CompareByTimes ($x,$y)//帮助方法
	{
		if ( $x[0] == $y[0] )
		return 0;
		else if ($x[0] > $y[0])
		return -1;
		else
		return 1;
	}
	function CompareByAccessTime ($x,$y)//帮助方法
	{
		$x[1] = Format2UnixTime($x[1]);   //先格式化为UNIX时间戳
		$y[1] = Format2UnixTime($y[1]); //先格式化为UNIX时间戳
		if ( $x[1] == $y[1] )
		return 0;
		else if ($x[1] > $y[1])
		return -1;
		else
		return 1;
	}
	function mytablestyle(){
		$style=<<
STYLE;
		echo $style;
	}
	/**
 * $order为排序方式: 0:按访问次数排序(缺省值) 1:按最近一次访问的时间排序 
 */
	function GetAccessByLog ($timeformat=1,$order=0)
	{
		$this->mytablestyle();
		if ( file_exists($this->filename) )
		{
			$handle = fopen ($this->filename, "r");
			$ip_times = array();
			while (!feof ($handle)) {//读入日志文件内容
				$buffer = fgets($handle, 999);
				if ((preg_match("#\d{1,2}\/\w{1,3}\/\d{1,4}\:\d{1,2}\:\d{1,2}\:\d{1,2}#",$buffer,$access_time)) && (preg_match("#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#",$buffer,$ip)))
				{
					$ip = $ip[0];
					$access_time = $access_time[0];
					$access_time=$this->Format2UnixTime($access_time);
					$access_time=strftime(" %Y-%m-%d %H:%M:%S " ,$access_time);
					if ( in_array($ip,array_keys($ip_times)))
					{
						$ip_times[$ip][0]++;//$ip_times[$ip][0]为访问次数times
						$ip_times[$ip][1]=$access_time;//$ip_times[$ip][1]为访问时间access_time
					}else
					{
						$ip_times[$ip][0] = 1;
						$ip_times[$ip][1]=$access_time;
					}
				}
			}
			fclose ($handle);
		}
		else
		{
			echo $this->filename;
			echo "日志文件不存在,请检查路径";
			exit;
		}
		if ( $order==1 )
		{
			$compare = "CompareByAccessTime";//按最近一次访问时间排序方法
			$title = "按最近一次访问时间排序";
		}
		else
		{
			$compare = "CompareByTimes"; //按访问次数排序方法
			$title = "按访问次数排序";
		}

		echo $title;
		echo "";
		foreach ($ip_times as $ip=>$value)
		{
			echo "";
		}
		echo "
IP访问次数最近一次访问时间
".$ip."".$value[0]."".$value[1]."
"; } /** * 查看部分日志记录 * 从start到end区间的记录 */ function GetAccessByLogPart ($start,$end) { $this->mytablestyle(); if ( file_exists($this->filename) ) { $handle = fopen ($this->filename, "r"); $ip_times = array(); $i=0; echo $start."---".$end; echo ""; //读入日志文件内容 while (!feof ($handle)) { $i++; $buffer = fgets($handle, 999); if($i>$start&&$i<$end) { echo ""; if ((preg_match("#\d{1,2}\/\w{1,3}\/\d{1,4}\:\d{1,2}\:\d{1,2}\:\d{1,2}#",$buffer,$access_time)) && (preg_match("#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#",$buffer,$ip))) { $ip = $ip[0]; $access_time = $access_time[0]; $access_time=$this->Format2UnixTime($access_time); $access_time=strftime(" %Y-%m-%d %H:%M:%S " ,$access_time); echo "";//$ip_times[$ip][0]为访问次数times echo ""; } echo ""; } } echo "
编号访问时间来访者IP
".($i)."".$ip_times[$ip][1]=$access_time;//$ip_times[$ip][1]为访问时间access_time echo "$ip
"; fclose ($handle); }else { echo $this->filename; echo "日志文件不存在,请检查路径"; exit; } } /** * 从$start时间到$end时间的记录 */ function GetAccessByLogPart_Bytime ($start,$end) { $this->mytablestyle(); if ( file_exists($this->filename) ) { $handle = fopen ($this->filename, "r"); $ip_times = array(); $i=0; echo $start."---".$end; echo ""; //读入日志文件内容 while (!feof ($handle)) { $i++; $buffer = fgets($handle, 999); if($i>$start&&$i<$end) { if ((preg_match("#\d{1,2}\/\w{1,3}\/\d{1,4}\:\d{1,2}\:\d{1,2}\:\d{1,2}#",$buffer,$access_time)) && (preg_match("#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#",$buffer,$ip))) { $ip = $ip[0]; $access_time = $access_time[0]; $access_time=$this->Format2UnixTime($access_time); $access_time=strftime(" %Y-%m-%d %H:%M:%S " ,$access_time); echo "";//$ip_times[$ip][0]为访问次数times echo ""; } } } echo "
编号访问时间来访者IP
".$ip_times[$ip][0]++."".$ip_times[$ip][1]=$access_time;//$ip_times[$ip][1]为访问时间access_time echo "$ip
"; fclose ($handle); }else { echo $this->filename; echo "日志文件不存在,请检查路径"; exit; } } } /** * 测试一下 */ $log = new myapachelog("access.log"); //0:按访问次数排序(缺省值);1:按最近一次访问的时间排序。 $my->GetAccessByLog(); ?>