分享PHP开发简单实现定时监控nginx日志文件功能示例

2018-06-29 14:06:47 573浏览

今天扣丁学堂小编给大家整理了一下关于PHP培训班实例讲述了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;
  }elseif($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);
  }
  }elseif($add_size<0){//第二天从头部开始
  $file_size=0;
  }
  sleep(2);
  }
  fclose($fp);
  /**
  *每次启动时获取上次打开文件位置
  */
  functionget_filesize(){
  $size=file_get_contents(LOG_SIZE);
  return$size;
  }
  /**
  *每次提交后保存这次读取文件的位置
  */
  functionsave_filesize($size){
  returnfile_put_contents(LOG_SIZE,$size);
  }
  /**
  *http请求
  *@paramarray$data
  *@returnboolean
  */
  functionhttp_post($url='',$data=array())
  {
  if(empty($url)){
  returnFALSE;
  }
  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视频教程供学员观看学习,喜欢PHP的小伙伴快快行动吧。扣丁学堂PHP技术交流群:374332265。

扣丁学堂微信公众号



【关注微信公众号获取更多学习资料】



查看更多关于“php培训资讯”的相关文章>>

标签: PHP培训 PHP视频教程 PHP从入门到精通 PHP学习路线图 PHP开发工程师

热门专区

暂无热门资讯

课程推荐

微信
微博
15311698296

全国免费咨询热线

邮箱:codingke@1000phone.com

官方群:148715490

北京千锋互联科技有限公司版权所有   北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
京ICP备12003911号-6   Copyright © 2013 - 2019

京公网安备 11010802030908号