【问题标题】:Cron was set to Insert data into a table every 5 minutes using crontab, but only insert at the hour (1:00) not every 5 minutes as expected将 Cron 设置为使用 crontab 每 5 分钟将数据插入表中,但仅在每小时 (1:00) 插入数据,而不是按预期每 5 分钟插入一次
【发布时间】: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;">&#160;Observation&#160;</span>
    <!--&#160;|&#160;
    <span style="background-color: #0F9;">&#160;Forecast&#160;</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


【解决方案1】:

在 cron 中每 5 分钟运行一次作业:

*/5 * * * * /path/to/script.php

【讨论】:

  • Cron 已正确设置为每 5 分钟运行一次,但仍仅在 :00 分钟插入数据并跳过 5 分钟 :05, :10 :15, :20...... –I得到这个日志。未定义变量:/insert/ndbc.php 第 43 - 49 行中的实值
【解决方案2】:

您可以每五分钟运行一次代码。为此,您需要将 Crontab 文件修改为

* * * * *  /scriptpage.php

【讨论】:

  • Cron 设置为每 5 分钟一次,但仍仅在 :00 分钟插入数据并跳过 5 分钟 :05, :10 :15, :20......
  • 它确实在 1:00 时正确插入数据。但是每五分钟(1:05、1:10、1:15……我得到这个日志。未定义的变量:/insert/ndbc.php 中的实值在第 43 - 49 行
猜你喜欢
  • 1970-01-01
  • 2019-12-20
  • 2012-12-27
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多