MENU

计划任务的胜利——Fsdbase On PHP

August 30, 2013 • 程序阅读设置

继昨日解决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对于连线检测的实现方法,不知道是否科学。但目前来看使用正常,有这一点也就达到目的了。

源码此处下载

Archives Tip
QR Code for this page
Tipping QR Code