有时候客户端上传的数据不需要马上处理,等到一定周期再批量处理,而这时的数据就先用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 ); }