此功能是為了實(shí)現(xiàn),定時(shí)監(jiān)控nginx生成的日志數(shù)據(jù),并將新增的數(shù)據(jù)提交到一個(gè)接口(比如大數(shù)據(jù)的接口,讓大數(shù)據(jù)來進(jìn)行分析)
define("MAX_SHOW", 8192*5); //新增數(shù)據(jù)提交閾值
define("LOG_NAME", ""); //讀取的日志文件
define("LOG_SIZE", ""); //保留上次讀取的位置
define("LOG_URL", ""); //日志提交地址
//運(yùn)行時(shí)log文件原始大小
$log_size = get_filesize();
$file_size = filesize(LOG_NAME);
if(empty($log_size)){//沒有記錄上次位置,則從當(dāng)前位置開始
$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){
//大于一個(gè)閾值提交數(shù)據(jù)
if($add_size > MAX_SHOW){
fseek($fp, $file_size);
//當(dāng)增加量超過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;
//記錄當(dāng)前位置
save_filesize($file_size);
}
}else if($add_size 0){ //第二天從頭部開始
$file_size = 0;
}
sleep(2);
}
fclose($fp);
/**
* 每次啟動(dòng)時(shí)獲取上次打開文件位置
*/
function get_filesize(){
$size = file_get_contents(LOG_SIZE);
return $size;
}
/**
* 每次提交后保存這次讀取文件的位置
*/
function save_filesize($size){
return file_put_contents(LOG_SIZE, $size);
}
/**
* http請(qǐng)求
* @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;
}
需要優(yōu)化的邏輯:當(dāng)中間進(jìn)程掛了,停了一段時(shí)間,再啟動(dòng)時(shí),從上次的位置重新讀取,提交的數(shù)據(jù)會(huì)比較大,可能會(huì)超過提交數(shù)據(jù)大小的限制
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP日志操作技巧總結(jié)》、《php文件操作總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》