讀取日誌文件開發總結

最後實現:php

查詢條件ajax

  1. 關鍵字搜索  2.關鍵字+開始日期   3.開始日期+結束日期   4.關鍵字+時間段數據庫

技術點:數組

  1. 讀取文件模塊化

    1. 本人沒涉及過PHP文件讀取,都是現用現看 菜了函數

    2. 正則匹配截取出相應的字符串(浪費了很長時間,由於本身正則也是個白蛋)spa

    3. 把截取出的字符串壓入數組並返回做爲最後操做的數據庫調試

    function readLogFile($date,$param=array()){
        $filename="../../client/http/MonitorLog/$date.log";
        if (file_exists($filename)) {
            $handle=@fopen($filename, "r");  //獲取文件資源句柄
            $log_list=array();
            $i=0;
            if ($handle) {
                while(!feof($handle)){
                    $buffer=fgets($handle,4096);  //讀取每行的字符串
                    $i++;
                    $time=substr($buffer,0,19);
                    preg_match_all("/(?:\()(.*)(?:\))/i",$buffer,$matches);
                    $phone=$matches[1][0];
    
                    preg_match_all("/(?:\s)(.*)(?:\()/i",substr($buffer,19),$matches);
                    $user_name=$matches[1][0];
    
                    preg_match_all("/(?:\輛)((\d)*)/",substr($buffer,19),$matches);
                    $car_id=$matches[1][0];
    
                    if(!empty($car_id)){
                        $carInfo=getCarInfo($car_id);
                        $number=$carInfo['number'];
                        $model=$carInfo['model'];
                        $brand=$carInfo['brand'];
    
                    }
    
                    preg_match_all("/(?:\發)(.*)/",substr($buffer,19),$matches);
                    $content=$matches[0][0];
    
                    if( is_array($param) && count($param) !=0 ){  //查詢時 根據條件獲取數據
                        if($param['keyword']==$phone || $param['keyword']==$number){
                            $log_list[$i]['phone']=$phone;
                            $log_list[$i]['number']=$number;
                            $log_list[$i]['model']=$model;
                            $log_list[$i]['brand']=$brand;
                            $log_list[$i]['car_id']=$car_id;
                            $log_list[$i]['user_name']=$user_name;
                            $log_list[$i]['time']=$time;
                            $log_list[$i]['content']=$content;
                        }
                    }else{
                        $log_list[$i]['phone']=$phone;
                        $log_list[$i]['number']=$number;
                        $log_list[$i]['model']=$model;
                        $log_list[$i]['brand']=$brand;
                        $log_list[$i]['car_id']=$car_id;
                        $log_list[$i]['user_name']=$user_name;
                        $log_list[$i]['time']=$time;
                        $log_list[$i]['content']=$content;
                    }
                }
                fclose($handle);  //關閉資源句柄
            }
            array_pop($log_list);
            array_pop($log_list);
            return $log_list;  //返回最後的數據
    
        }
    }
  2. 2.分頁操做日誌

    a.分頁利用Ajax分頁,code

            點擊下一頁的時候利用ajax 把條件(好比說查詢條件)以及當前第幾頁page參數傳過來,提交給query函數,根據條件查詢出相應的數據做爲最後的數據庫,

    b.利用PHP 核心函數  array_slice實現對數組的分頁顯示

    /**
     * 數組分頁函數  核心函數  array_slice
     * 用此函數以前要先將數據庫裏面的全部數據按必定的順序查詢出來存入數組中
     * $count   每頁多少條數據
     * $page   當前第幾頁
     * $array   查詢出來的全部數組
     * order 0 - 不變     1- 反序
     */
    function page_array($count,$page,$array,$order,$keyword,$date_start,$date_after){
    
        global $countPage; #定全局變量
        $page=(empty($page))?'1':$page; #判斷當前頁面是否爲空 若是爲空就表示爲第一頁面
        $start=($page-1)*$count; #計算每次分頁的開始位置
        if($order==1){
            $array=array_reverse($array);
        }
        $totals=count($array);
        $countPage=ceil($totals/$count); #計算總頁面數
        $pageData=array();
        $pageData=array_slice($array,$start,$count);
        #返回查詢參數,以便再次點擊下一頁時會根據查詢條件查詢相應的數據
        $filter['page']=$page;
        $filter['page_size']=$count;
        $filter['keyword']=$keyword;
        $filter['date_start']=$date_start;
        $filter['date_end']=$date_after;
    
        return array('result' => $pageData,  'page_count' => $countPage,'filter' =>$filter,'record_count'=>$totals);
    }

  3. 問題:

    1.日誌文件不存在時,無返回,直接斷死,(好比查詢一個時間段,結束日期或開始日期過長沒有日誌文件,則中間有的也不顯示,由於當遇到文件不存在時直接報了異常)

            在讀取文件以前先判斷日誌文件是否存在

    function checkFile($date){
        $filename="../../client/http/MonitorLog/$date.log";
        if(file_exists($filename)){
            return true;
        }
        return false;
    }
  4. elseif(empty($keyword) && !empty($date_start)){
            $log_list=array();
            for($date_start;$date_start<=$date_end;$date_start+=86400){
                if(checkFile(date('Y-m-d',$date_start))){
                    $result =  getLog(date('Y-m-d',$date_start),array());
                    $log_list=array_merge($log_list,$result);
                }
    
    
            }
        }
  5. 2.正則匹配須要多加練習

    3.靈活使用for循環--死角使用數字

            求時間段時本身先把大幾天算出來 而後

    for($int=0;$int<=$days;$int++)
    {
        而後加上86400
        再轉換成時間格式date('Y-m-d',$date_start)
    }
    何其繁瑣,下面的方法精煉簡單
  6.  for($date_start;$date_start<=$date_end;$date_start+=86400){
         date('Y-m-d',$date_start)
     }
  7.     時間戳比較,下面用時直接轉換成日期格式

    4.代碼邏輯模塊化

        條理清晰,放便調試

        須要多看別人的代碼,多想,多寫多練,才能提高

    總結:遇到一次困難就是一次成長的經歷,要勇於面對,努力嘗試,總結弱點,多加練習,再下一次遇到時垂手可得地順利拿下

相關文章
相關標籤/搜索