PHP解析Nginx日志里的Get数据

  • 2021年4月25日
  • 技术

有时候客户端上传的数据不需要马上处理,等到一定周期再批量处理,而这时的数据就先用nginx日志保存。

nginx默认Access日志格式

log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';

字段说明

remote_addr : 远程客户端的ip地址
remote_user : 远程客户端用户名称
time_local : 访问的时间与时区
request : 完整的原始请求行
status : 记录请求返回的http状态码
body_bytes_sent : 发送给客户端的文件主体内容的大小
http_referer : 从哪个页面链接访问过来
http_user_agent : 客户端浏览器信息

数据示例

192.168.1.23 - - [08/Apr/2021:07:30:28 +0000] "GET /test/ HTTP/1.1" 200 22865 "http://test.com/test.php" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"把

使用正则解析请求数据,将get参数转化为数组

$pattern = '/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*-\s*-\s*\[(.*?\s+.*?)\]\s*"(GET|POST)\s*([\s\S]*?)\s*HTTP\/\d+\.\d+"/isu';
while ( ( $str = gzgets( $file, 10240 ) ) ) {
	preg_match_all( $pattern, $str, $matches );
	if ( ! isset( $matches[4][0] ) ) {
		continue;
	}
	$getData = explode( '?', $matches[4][0] );
    parse_str( $getData[1], $output );
	print_r( $output );
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注