이 글에서는 주로 PHP의 nginx 서버 로그 예약 읽기와 컬 기반 데이터 전송 관련 운영 기술을 포함한 PHP의 간단한 nginx 로그 파일 구현을 소개합니다.
이 글에서는 간단한 구현 방법을 설명합니다. 예제가 포함된 PHP nginx 로그 파일을 정기적으로 모니터링합니다. 참고를 위해 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.
이 기능은 nginx에서 생성된 로그 데이터를 구현하고 정기적으로 모니터링하며 새 데이터를 인터페이스(예: 빅 데이터 인터페이스, 빅 데이터 허용)에 제출하는 것입니다. 분석)
define("MAX_SHOW", 8192*5); //新增数据提交阈值 define("LOG_NAME", ""); //读取的日志文件 define("LOG_SIZE", ""); //保留上次读取的位置 define("LOG_URL", ""); //日志提交地址 //运行时log文件原始大小 $log_size = get_filesize(); $file_size = filesize(LOG_NAME); if(empty($log_size)){//没有记录上次位置,则从当前位置开始 $file_size = $file_size; }else if($log_size > $file_size){ //说明是第二天的日志文件,指针放到文件头 $file_size = 0; }else{ //从上次记录的位置开始 $file_size = $log_size; } $file_size_new = 0; $add_size = 0; $ignore_size = 0; $fp = fopen(LOG_NAME, "r"); while(1){ clearstatcache(); $read_num = 0; $file_size_new = filesize(LOG_NAME); $add_size = $file_size_new - $file_size; $add_data = array(); $add_log = ''; if($add_size > 0){ //大于一个阈值提交数据 if($add_size > MAX_SHOW){ fseek($fp, $file_size); //当增加量超过8192,需要分页读取增加量 $page = ceil($add_size/8192); for($i=1; $i<=$page; $i++){ if($i == $page){//最后一页 $end_add = $add_size - ($page -1) * 8192; $add_log .= fread($fp, $end_add); }else{ $add_log .= fread($fp, 8192); $file_size_step = $file_size + $i * 8192; fseek($fp, $file_size_step); } } $add_data['add_log'] = $add_log; $add_data['add_log'] = base64_encode($add_data['add_log']); http_post(LOG_URL, $add_data); $file_size = $file_size_new; //记录当前位置 save_filesize($file_size); } }else if($add_size < 0){ //第二天从头部开始 $file_size = 0; } sleep(2); } fclose($fp); /** * 每次启动时获取上次打开文件位置 */ function get_filesize(){ $size = file_get_contents(LOG_SIZE); return $size; } /** * 每次提交后保存这次读取文件的位置 */ function save_filesize($size){ return file_put_contents(LOG_SIZE, $size); } /** * http请求 * @param array $data * @return boolean */ function http_post($url = '', $data = array()) { if(empty($url)){ return FALSE; } if($data){ $data = http_build_query($data); } $ch = curl_init (); curl_setopt ( $ch, CURLOPT_URL, $url ); curl_setopt ( $ch, CURLOPT_POST, 1 ); curl_setopt ( $ch, CURLOPT_HEADER, 0 ); curl_setopt ( $ch, CURLOPT_TIMEOUT, 5 ); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data ); $return = curl_exec ( $ch ); curl_close ( $ch ); return $return; }
주의사항: 자정 이후에는 로그파일이 잘리기 때문에 다음날 로그는 로그파일의 선두부터 읽어야 한다는 판단이 필요합니다
최적화가 필요한 로직: 중간 프로세스가 일정 시간 동안 중단되고 중지되는 경우 다시 시작하면 마지막 위치부터 다시 읽혀집니다. 제출된 데이터가 더 커지고 제출된 데이터 크기 제한을 초과할 수 있습니다. 위 내용은 이 글의 전체 내용입니다. 모든 분들께 도움이 되기를 바랍니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트를 주목해 주세요.
관련 권장 사항:
PHP가 zlib 확장을 사용하여 GZIP 압축 출력을 구현하는 방법에 대한 자세한 설명 PHP가 분산 Memcache를 구현하여 웹 클러스터 세션 동기화를 설정하는 방법에 대한 자세한 설명 mongoDB 데이터베이스 작업 완료 PHP로 구현된 클래스 예제 설명위 내용은 PHP는 nginx 로그 파일을 정기적으로 모니터링하는 기능을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!