继昨日解决FSD在Linux运行之后,今天又被问到Perl的安装——想得到这与FSD有关:FSDBase需要Perl的支持。不得不佩服fsdbase的作者,几个文件每个都是2000 lines+的代码量,果断不看(本来就没接触过perl)。看到fsdbase目录下有个setup.sh,打开看看,在末尾发现了一小段提示,意为使用者需要在crontab中添加运行fsdbase的脚本,每分钟执行一次。事已至此,基本上就能明白fsdbase的原理了,和想象中的基本一致,也和拐总以前透露的方法差不多。这样一来,心里就有底了。接下来当然是使用php写一个差不多功能的东西,一来是帮助他人,二来是试试之前的epdb到底是否好使,三来也算是完成两三年来没能做到给fsd统计在线时间的心愿吧。
做事先从熟悉的地方切入——whazzup.txt
。分析每一行数据,都是由37个冒号分开的。对每个数据研究了许久得到了下述结论:
$data = array(
'1'=>'呼号',
'2'=>'VID',
'3'=>'姓名',
'4'=>' 飞/管',
'5'=>'频率(管)',
'6'=>'纬度',
'7'=>'经度',
'8'=>'高度',
'9'=>'地速',
'10'=>'机型',
'11'=>'真空速',
'12'=>'起飞',
'13'=>'航高',
'14'=>'落地',
'15'=>'服务器',
'18'=>'应答机号',
'22'=>'IFR/VFR',
'23'=>'预计起飞时间',
'24'=>'实际起飞时间',
'29'=>'备降',
'30'=>'备注',
'31'=>'航路',
'38'=>'连接戳',
);
其中最后一项是什么,什么规律的确不知道,但是我发现它对于每一次连接来说都是唯一的,可以作为一次连接的判断标准。那么暂且叫它连接戳是最合适的了。花了几十分钟写完,本来想着可能会很复杂,其实倒也不算太麻烦,总共150行的样子,其中废话也不少。目前实现的功能是对每个用户的飞行/管制时间进行统计、记录最后飞行/管制时间,记录每个连线航班/连线管制的基本信息。思路大致如下:
1.数据表规划
共3个数据表:用户表(储存飞管时间、最后飞管时间)、飞行记录表、管制记录表。
2.内容主动记录
a)打开whazzup文件,逐行遍历。对每行进行如下操作:使用正则表达式(写这篇文章的时候我才想到也许使用explode()会更快一点)获取所需的各种数据。搜索用户表,若存在,更新最后飞/管时间,不存在插入一行。判断第4项数据,将飞行员与管制员分开,方便数据表操作。接下来的介绍以飞行表为例:搜索连接戳,若有记录,则更新,没有记录,则插入。管制表操作相同。
3.时间累计
还是以飞行记录表为例:取出无结束时间的记录,逐条使用记录的连接戳遍历whazzup,若存在则表示仍在进行中,不操作。若不存在则表示该次航班已结束,将结束时间写入该行数据。使用当前时间与开始时间进行比对,得到总时长,累加到用户表上。管制记录表操作相同。
至此程序结束,将程序添加到crontab中每分钟执行一次即可。FOP的思路基本参考VA China对于连线检测的实现方法,不知道是否科学。但目前来看使用正常,有这一点也就达到目的了。