之前做的环境监控,由于硬件条件,有很多垃圾数据,数据画成折线图后忽大忽小,有用的趋势无法正确体现。决定用php把相距较大的数据取一下平均值进行处理,三个数据为一组。效果当然还不完美,但是凑合着还是有效果的,够用了。
首先接收来的数据所添加的数据库里面要加一个触发器,添加的同时在另外的一个表里面复制一份。
[cce]insert into smoothdata(温度) values(new.温度);[/cce] 然后php去处理smoothdata里的数据
php文件的思路就是找“尖”,然后把尖用平均值来替代。
[cce] [cce_php] <?php error_reporting(E_ALL ^ E_DEPRECATED^ E_NOTICE); include ("connect.php"); data1=0;data2=0;data3=0;num=2; id;time1 = date("Y-m-d H:i:s",strtotime('now')-15*60); time2 = date("Y-m-d H:i:s",strtotime('now'));i=4;//误差太大的时候一次平滑不够 while(i--){sql = "select * from smoothdata where time<'time2' and time>'time1' order by id desc"; echo sql;echo "
";re= mysql_query(sql); while(row=@mysql_fetch_array(re)){ if(isset(data1)&&isset(data2)&&isset(data3)) { if(num==2)//确保最后一个读的是完整的“尖” {data1=row['温度'];num--; } else if(num==1) {data2=row['温度'];num--; } else if(num==0) {data3=row['温度'];num--; } else { //echo row['time'];data1 = data2;data2 = data3;data3 = row['温度']; if((data2-data1)*(data2-data3)>0)//去尖 if(abs(data1-data2)>1 and abs(data2-data3)>1) { //全部取中间平均值处理data2 = number_format((data1+data3)/2,1); id =row['Id']+1; sql ="update smoothdata set 温度='data2' where Id = 'id';"; mysql_query(sql); //echo sql; } } } } }logfile = fopen("smoothlog.txt", "a"); time = 0;txt = date("y-m-d h:i:s",time());; echo txt; fwrite(logfile, txt); fwrite(logfile, "phprun\r\n"); ?> [/cce_php] [/cce]
[cce_php] <?php error_reporting(E_ALL ^ E_DEPRECATED^ E_NOTICE); include ("connect.php"); data1=0;data2=0;data3=0;num=2; id;time1 = date("Y-m-d H:i:s",strtotime('now')-15*60); time2 = date("Y-m-d H:i:s",strtotime('now'));i=4;//误差太大的时候一次平滑不够 while(i--){sql = "select * from smoothdata where time<'time2' and time>'time1' order by id desc"; echo sql;echo "
";re= mysql_query(sql); while(row=@mysql_fetch_array(re)){ if(isset(data1)&&isset(data2)&&isset(data3)) { if(num==2) {data2=row['温度'];num--; } else if(num==1) {data3=row['温度'];num--; } else { //echo row['time'];data1 = data2;data2 = data3;data3 = row['温度']; if((data2-data1)*(data2-data3)>0)//去尖 if(abs(data1-data2)>1 and abs(data2-data3)>1) { //全部取中间平均值处理data2 = number_format((data1+data3)/2,1); id =row['Id']+1; sql ="update smoothdata set 温度='data2' where Id = 'id';"; mysql_query(sql); //echo sql; } } } } }logfile = fopen("smoothlog.txt", "a"); time = 0;txt = date("y-m-d h:i:s",time());; echo txt; fwrite(logfile, txt); fwrite(logfile, "phprun\r\n"); ?> [/cce_php]
然后就是要让这个文件自动去执行。写一个bat文件,里面把日志也要记好。
[cce] C:\\php.exe C:\datasmooth.php @echo off set "year=%date:~0,4%" set "month=%date:~5,2%" set "day=%date:~8,2%" set "hour_ten=%time:~0,1%" set "hour_one=%time:~1,1%" set "minute=%time:~3,2%" set "second=%time:~6,2%" if "%hour_ten%" == " " ( echo %year%-%month%-%day% %hour_one%:%minute%:%second%>> smoothlog.txt ) else ( echo %year%-%month%-%day% %hour_ten%%hour_one%:%minute%:%second%>> smoothlog.txt ) exit [/cce]
然后在任务计划里面添加任务,需要注意的一点是,添加操作的时候,写了程序的位置以后,“起始于”也要填写,要不日志就写到system32文件夹里去了。
OK,收工