【发布时间】:2015-06-29 19:52:16
【问题描述】:
此脚本用于插入来自气象站的风数据。数据来自此在线文本文件。气象站每 5 分钟报告一次并更新其文本文件。 http://www.ndbc.noaa.gov/data/realtime2/IMGP4.txt
Crontab 设置为每五分钟运行一次,但仅每小时插入一次数据。作为一种测试模式,我们将 crontab 更改为每 :15 分钟运行一次,它正在这样做。让我们假设它在 1:15 运行。 1:00, 1:05, 1:10 和 1:15 的过去数据被插入到表中,它将停止插入新数据(1:30, 1:45, 2:00 没有)直到下一个小时将在 2:15 再次运行,并且将执行相同的操作(插入过去的数据 2:00、2:05、2:10 和 2:15)。
数据示例
#YY MM DD hh mm WDIR WSPD GST WVHT DPD APD MWD PRES ATMP WTMP DEWP VIS PTDY TIDE
2015 07 13 17 20 120 7.7 11.3 MM MM MM MM 1016.0 29.9 MM MM MM MM MM
2015 07 13 17 15 120 7.7 11.8 MM MM MM MM 1016.0 29.8 MM MM MM MM MM
2015 07 13 17 10 110 7.7 11.8 MM MM MM MM 1016.0 29.7 MM MM MM MM MM
2015 07 13 17 05 110 7.2 11.3 MM MM MM MM 1016.0 29.7 MM MM MM MM MM
2015 07 13 17 00 120 7.7 11.8 MM MM MM MM 1016.0 29.6 MM MM MM -0.8 MM
日志显示问题出在以下几行:
$date = $realvalues[0]."-".$realvalues[1]."-".$realvalues[2];
$time = $realvalues[3].":".$realvalues[4].":00";
$wdir = str_replace('MM','',$realvalues[5]);
$spd = str_replace('MM','',$realvalues[6])*1.94384449;
$gust = str_replace('MM','',$realvalues[7])*1.94384449;
$atem = str_replace('MM','',$realvalues[14]);
$timeval = gmmktime($realvalues[3],$realvalues[4],"00",$realvalues[1],$realvalues[2],$realvalues[0]);
//echo $timeval." <= ".$timemax.'<br>';$control++;
if($timeval <= $timemax){unset($realvalues);continue;}
//echo $realvalues[3].",".$realvalues[4].","."00".",".$realvalues[1].",".$realvalues[2].",".$realvalues[0].'<br>';
//echo $info2['MAX(date)']." == ".$date." && ".$maxTime[0]."==".$realvalues[3]." && ".$maxTime[1]."==".$realvalues[4]."<br/>";
if($info2['MAX(date)']<$date){
$query = sprintf("INSERT INTO `ndbc` (`station_id`,`date`,`time`,`Wind Direction (-4m)`,`Wind Speed (-4m)`,`Air Temperature (-3m)`,`Wind Gust (-4m)`) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s')",$info['id'], $date, $time, $wdir, $spd, $atem, $gust);echo $query.'<br/>';//die();
mysql_query($query);
创建表脚本:
<?php
require_once("../connections/connection_index.php");
function getData($id, &$xdata, &$ydata, &$dirdata, &$yesterday, &$future, &$realStation, &$xdata2, &$ydata2, &$dirdata2, &$gust, &$gust2){
$query = sprintf("SELECT `type`,`wind station relation`,`wind platform relation`,`name`,`platform` FROM `stations` WHERE id = '".$id."'");//echo $query;die();
$result = mysql_query($query);
$info = mysql_fetch_assoc($result);
$realStation = $info['name'];
$now_datetime = gmdate("Y-m-d H:00:00");
$val = explode(' ',$now_datetime);
$time = explode(':',$val[1]);
$date = explode('-',$val[0]);
$timestamp = gmmktime($time[0], 0, 0, $date[1], $date[2], $date[0]);
$yesterday = $timestamp-3600*16;
$future = $timestamp;//+3600*18;
$old_datetime = gmdate("Y-m-d H:00:00",$yesterday);
$old_val = explode(' ',$old_datetime);
$future_datetime = gmdate("Y-m-d H:00:00",$future);
$future_val = explode(' ',$future_datetime);
$query = sprintf("SELECT `date`,`time`,`Wind Speed (-4m)`,`Wind Direction (-4m)`,`Wind Gust (-4m)` FROM `".$info['platform']."` WHERE station_id = '".$id."' AND date BETWEEN '%s' AND '%s'",$old_val[0],$future_val[0]);//echo $query;die();
$result2 = mysql_query($query);
while($info2 = mysql_fetch_assoc($result2)){
$time = explode(':',$info2['time']);
$date = explode('-',$info2['date']);
$timestamp = gmmktime($time[0], 0, 0, $date[1], $date[2], $date[0]);
if($info['type']=='observation'){
$xdata[]= $timestamp-3600*4;
$ydata[]= $info2['Wind Speed (-4m)'];
$dirdata[]= $info2['Wind Direction (-4m)'];
$gust[]= $info2['Wind Gust (-4m)'];
}
else{
$xdata2[]= $timestamp-3600*4;
$ydata2[]= $info2['Wind Speed (-4m)'];
$dirdata2[]= $info2['Wind Direction (-4m)'];
$gust2[]= $info2['Wind Gust (-4m)'];
}
}
if(!empty($info['wind station relation']) && !empty($info['wind station relation'])){
if($info['type']=='observation'){
$type='forecast';
}
else{
$type='observation';
}
$query = sprintf("SELECT `id` FROM `stations` WHERE `code` = '".$info['wind station relation']."' AND type = '".$type."'");//echo $query;die();
$result3 = mysql_query($query);
$info3 = mysql_fetch_assoc($result3);
$query = sprintf("SELECT `date`,`time`,`Wind Speed (-4m)`,`Wind Direction (-4m)` FROM `".$info['wind platform relation']."` WHERE station_id = '".$info3['id']."' AND date BETWEEN '%s' AND '%s'",$old_val[0],$future_val[0]);//echo $query;die();
$result3 = mysql_query($query);
while($info3 = mysql_fetch_assoc($result3)){
$time = explode(':',$info3['time']);
$date = explode('-',$info3['date']);
$timestamp = gmmktime($time[0], 0, 0, $date[1], $date[2], $date[0]);
if($type=='observation'){
$xdata[]= $timestamp-3600*4;
$ydata[]= $info3['Wind Speed (-4m)'];
$dirdata[]= $info3['Wind Direction (-4m)'];
$gust[]= $info3['Wind Gust (-4m)'];
}
else{
$xdata2[]= $timestamp-3600*4;
$ydata2[]= $info3['Wind Speed (-4m)'];
$dirdata2[]= $info3['Wind Direction (-4m)'];
$gust2[]= $info3['Wind Gust (-4m)'];
}
}
}
}
function cmp($a, $b) {
return strcmp($a[0], $b[0]);
}
function getticks(&$Ticks,$yesterday,$future){
$value=$yesterday;
$i=0;
$Ticks=array();
while($value<=$future){
$Ticks[$i]=$value;
$value=$value+3600;
$i++;
}
}
$station=$_GET["ID"];
$numOfValues=12;
getData($station,$xdata,$ydata,$dirdata,$yesterday,$future,$realStation,$xdata2,$ydata2,$dirdata2,$gust,$gust2);
getticks($Ticks,$yesterday,$future);
$observation = array(array());
$j=0;
foreach($xdata as $x){
$i=0;
$observation[$j][$i]=$x;
$i++;
$observation[$j][$i]=$ydata[$j];
$i++;
$observation[$j][$i]=$dirdata[$j];
$i++;
$observation[$j][$i]=$gust[$j];
$j++;
}
usort($observation, "cmp");
$realxData = array();
$realyData = array();
$realdirData = array();
$realgustData = array();
$j=0;
$TestVar=false;
foreach($observation as $real){
if($TestVar && $real[0]!=$realxData[$j-1]){
$realxData[$j]=$real[0];
$realyData[$j]=number_format($real[1],1);
$realdirData[$j]=(int)($real[2]);
$realgustData[$j]=$real[3];
$j++;}
if($yesterday<=$real[0] && $TestVar==false){
$realxData[$j]=$real[0];
$realyData[$j]=number_format($real[1],1);
$realdirData[$j]=(int)($real[2]);
$realgustData[$j]=$real[3];
$j++;
$TestVar=true;}
}
if(count($realxData)>12){
array_splice($realxData,0,1);
array_splice($realyData,0,1);
array_splice($realdirData,0,1);
array_splice($realgustData,0,1);
/*unset($realxData[0]);
unset($realyData[0]);
unset($realdirData[0]);*/
}
/*$last_time=$real[0];
$forecast = array(array());
$j=0;
foreach($xdata2 as $x){
$i=0;
$forecast[$j][$i]=$x;
$i++;
$forecast[$j][$i]=$ydata2[$j];
$i++;
$forecast[$j][$i]=$dirdata2[$j];
$i++;
$forecast[$j][$i]=$gust2[$j];
$j++;
}
usort($forecast, "cmp");
$realxData2 = array();
$realyData2 = array();
$realdirData2 = array();
$realgustData2 = array();
$j=0;
$TestVar=false;
foreach($forecast as $real){
if($last_time < $real[0]){
if($TestVar && $real[0]!=$realxData2[$j-1]){
$realxData2[$j]=$real[0];
$realyData2[$j]=number_format($real[1],1);
$realdirData2[$j]=(int)($real[2]);
$realgustData2[$j]=$real[3];
$j++;}
if($yesterday<=$real[0] && $TestVar==false){
$realxData2[$j]=$real[0];
$realyData2[$j]=number_format($real[1],1);
$realdirData2[$j]=(int)($real[2]);
$realgustData2[$j]=$real[3];
$j++;
$TestVar=true;}
}
}*/
/*echo '<pre> OBSERVATION X: '; print_r($realxData); echo '</pre>';
echo '<pre> OBSERVATION Y: '; print_r($realyData); echo '</pre>';
echo '<pre> OBSERVATION DIR: '; print_r($realdirData); echo '</pre>';
echo '<pre> OBSERVATION Gust: '; print_r($realgustData); echo '</pre>';
echo '<pre> FORECAST X: '; print_r($realxData2); echo '</pre>';
echo '<pre> FORECAST Y: '; print_r($realyData2); echo '</pre>';
echo '<pre> FORECAST DIR: '; print_r($realdirData2); echo '</pre>';
echo '<pre> FORECAST gust: '; print_r($realgustData2); echo '</pre>';
die();*/
mysql_close($connection);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Table</title>
<style type="text/css">
#data_type{
background-color:#87AFC7;
font-weight:bold;
padding:0px;
margin:0px;
}
#legend{
background-color:#CCC;
text-align:center;
font-weight:bold;
font-size:larger;
padding:0px;
margin:0px;
}
#name{
background-color:#CCC;
text-align:center;
font-weight:bold;
padding:0px;
margin:0px;
}
#dates{
background-color:#CCC;
text-align:center;
font-weight:bold;
padding:0px;
margin:0px;
}
#hours{
background-color:#BDBDBD;
text-align:center;
width:70px;
padding:0px;
margin:0px;
}
#data_ob{
background-color: #9F3;
text-align:center;
padding:0px;
margin:0px;
}
#data_fore{
background-color: #0F9;
text-align:center;
padding:0px;
margin:0px;
}
</style>
</head>
<body>
<table cellspacing="1" style="margin:auto;">
<tr>
<td id="data_type">Legend:</td>
<td id="legend" colspan="<?php echo $numOfValues ?>"><span style="background-color: #9F3;"> Observation </span>
<!-- | 
<span style="background-color: #0F9;"> Forecast </span>
<span><img src="/app/elmer_test/icon.png" width="24" height="24"/>Missing Data</span>--></td>
</tr><tr>
<?php
echo "<td id=\"data_type\">Name:</td>";
echo "<td id=\"name\" colspan=\"".$numOfValues."\">".$realStation."</td>";
?>
</tr><tr>
<?php
//create days
echo "<td id=\"data_type\">Date:</td>";
$control=0;
$time=$yesterday;
$day=gmdate("d",$time);
//observation
foreach($realxData as $time){
if(gmdate("d",$time) == $day){
$control++;
}
else{
echo "<td id=\"dates\" colspan=\"".$control."\"><div style=\"width:80px; margin:auto;\">".gmdate("Y-m-d",$time-3600)."</div></td>";
$last_day=gmdate("d",$time-3600);
$control=1;
}
$day = gmdate("d",$time);
}
//new
if($control!=0){
//$control++;
echo "<td id=\"dates\" colspan=\"".$control."\"><div style=\"width:90px; margin:auto;\">".gmdate("Y-m-d",$time)."</div></td>";
}
//forecast
/*$control2=0;
$store_time=$time;
foreach($realxData2 as $time){
if($control2==0){
if(gmdate("d",$time) != $day){
echo "<td id=\"dates\" colspan=\"".$control."\">".gmdate("Y-m-d",$store_time)."</td>";
$last_day=gmdate("d",$store_time);
$control=0;
}
$control2=1;
$day = gmdate("d",$time);
}
if(gmdate("d",$time) == $day){
$control++;
}
else{
echo "<td id=\"dates\" colspan=\"".$control."\">".gmdate("Y-m-d",$time-3600*3)."</td>";
$last_day=gmdate("d",$time-3600*3);
$control=0;
}
$day = gmdate("d",$time);
}
$control++;
if($last_day != $day){
echo "<td id=\"dates\" colspan=\"".$control."\">".gmdate("Y-m-d",$time)."</td>";
}*/
?>
</tr><tr>
<?php
echo "<td id=\"data_type\">Time: (Local PR):</td>";
//create observation hours
$control=0;
foreach($realxData as $time){
echo "<td id=\"hours\">".gmdate("H",$time)."</td>";
$control++;
}
//create forecast hours
/*$control=0;
foreach($realxData2 as $time){
echo "<td id=\"hours\">".gmdate("H",$time)."</td>";
$control++;
}*/
?>
</tr><tr>
<?php
//create observation data
echo "<td id=\"data_type\">Wind Speed (kt):</td>";
$control=0;
foreach($realxData as $time){
echo "<td id=\"data_ob\">".$realyData[$control]."</td>";
$control++;
}
//create forecast data
/*$control=0;
foreach($realxData2 as $time){
echo "<td id=\"data_fore\">".$realyData2[$control]."</td>";
$control++;
}*/
?>
</tr><tr>
<?php
//create observation direction
echo "<td id=\"data_type\">Wind Direction (deg):</td>";
$control=0;
foreach($realxData as $time){
echo "<td id=\"data_ob\">".$realdirData[$control]."</td>";
$control++;
}
//create forecast direction
/*$control=0;
foreach($realxData2 as $time){
echo "<td id=\"data_fore\">".$realdirData2[$control]."</td>";
$control++;
}*/
?>
</tr><tr>
<?php
//create observation vector
echo "<td id=\"data_type\">Wind Vector:</td>";
$control=0;
foreach($realxData as $time){
if($realdirData[$control]<=360 && $realdirData[$control]>=0){
if(((($realdirData[$control])+180)%360)<10){
echo "<td id=\"data_ob\"><img src=\"/app/elmer_test/new_red_arrow/s0".((($realdirData[$control])+180)%360).".png\"/></td>";
}
else{
echo "<td id=\"data_ob\"><img src=\"/app/elmer_test/new_red_arrow/s".((($realdirData[$control])+180)%360).".png\"/></td>";
}
}
else{
echo "<td id=\"data_ob\"><img src=\"/app/elmer_test/icon.png\" width=\"24\" height=\"24\"/></td>";
}
$control++;
}
//create forecast vector
/*$control=0;
foreach($realxData2 as $time){
if($realdirData2[$control]<=360 && $realdirData2[$control]>=0){
if(((($realdirData2[$control])+180)%360)<10){
echo "<td id=\"data_fore\"><img src=\"/app/elmer_test/new_red_arrow/s0".((($realdirData2[$control])+180)%360).".png\"/></td>";
}
else{
echo "<td id=\"data_fore\"><img src=\"/app/elmer_test/new_red_arrow/s".((($realdirData2[$control])+180)%360).".png\"/></td>";
}
}
else{
echo "<td id=\"data_fore\"><img src=\"/app/elmer_test/icon.png\" width=\"24\" height=\"24\"/></td>";
}
$control++;
}*/
?>
</tr>
</table>
</body>
</html>
它确实在 1:00“整个”小时正确插入数据。但不是每五分钟插入一次数据(1:05、1:10、1:15……我得到这个日志。 未定义变量:/insert/ndbc.php 第 43 - 49 行中的实值
43 $date = $realvalues[0]."-".$realvalues[1]."-".$realvalues[2];
$time = $realvalues[3].":".$realvalues[4].":00";
$wdir = str_replace('MM','',$realvalues[5]);
$spd = str_replace('MM','',$realvalues[6])*1.94384449;
$gust = str_replace('MM','',$realvalues[7])*1.94384449;
$atem = str_replace('MM','',$realvalues[14]);
$timeval = gmmktime($realvalues[3],$realvalues[4],"00",$realvalues[1],$realvalues[2],$realvalues[0]);
//echo $timeval." <= ".$timemax.'<br>';$control++;
if($timeval <= $timemax){unset($realvalues);continue;}
//echo $realvalues[3].",".$realvalues[4].","."00".",".$realvalues[1].",".$realvalues[2].",".$realvalues[0].'<br>';
//echo $info2['MAX(date)']." == ".$date." && ".$maxTime[0]."==".$realvalues[3]." && ".$maxTime[1]."==".$realvalues[4]."<br/>";
if($info2['MAX(date)']<$date){
$query = sprintf("INSERT INTO `ndbc` (`station_id`,`date`,`time`,`Wind Direction (-4m)`,`Wind Speed (-4m)`,`Air Temperature (-3m)`,`Wind Gust (-4m)`) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s')",$info['id'], $date, $time, $wdir, $spd, $atem, $gust);echo $query.'<br/>';//die();
mysql_query($query);
unset($realvalues);
continue;
【问题讨论】:
-
尝试提供一些解释,而不仅仅是一堆代码。一些上下文、一些痕迹、错误消息(如果有)等可能有助于某人检查代码。
-
你用什么操作系统和 PHP 一起使用?
-
在 Ubuntu Linux 中运行。
-
编辑您的问题并添加
CREATE TABLE脚本和 .txt 文件的 2 行。 -
另外,修正缩进...
标签: mysql phpmyadmin crontab database-administration