1

我在 Linux 机器上运行 speedtest-cli,并使用 Cron 作业定期运行它:

#!/bin/bash
date >> /home/blob/speedtest.log
/usr/local/bin/speedtest --simple >> /home/blob/speedtest.log

这会输出四个变量,每个变量之间都有换行符:

Tue 31 Jan 20:00:01 UTC 2017
Ping: xx.xxx ms
Download: xx.xx Mbit/s
Upload: xx.xx Mbit/s

这些存储在一个连续的日志文件中。

我试图将它存储在一个五列 - ID、日期、ping、下载、上传 - 数据库中,这样我就可以运行 cron 作业,将结果读取到数据库,然后截断日志文件(所以它不会'没有重复):

<body>
<table>

<?php
    $f = fopen("/home/blob/speedtest.log", "r") or exit("Unable to open file!");
    $arr_to_insert = array();
    // Read line by line until end of file
    while (!feof($f)) { 

    // Make an array using line break as delimiter
       $arrEx = explode('\n',fgets($f)); 
    // Put exploded data in an array
       echo '<tr><td name="date">' . $arrEx[0] . '</td><td name="ping">' . $arrEx[1] . '</td><td name="download">' . $arrEx[2] . '</td><td name="upload">' . $arrEx[3] . '</td></tr>';
       //strore text file row to an array 
       $arr_to_insert[] = $arrEx;
    }

    fclose($f);
 {

    // Connect to Database
include '../includes/connection.php';
    // Database Insert
foreach($arr_to_insert as $di){
    $sql="INSERT INTO speed (date, ping, download, upload) VALUES ('{$di[0]}','{$di[1]}','{$di[2]}','{$di[3]}')";
    if (!mysqli_query($conn,$sql))
      {
      die('Error: ' . mysqli_error());
      }

}
mysqli_close($conn);
}
?>
</table>
</form>
</body>
</html>

它确实存储了数据——所以没有错误消息——但都在一个列中,而不是每个 cron 作业都填充一行;日期进入日期,ping 中,等等。

ID  date    ping    download    upload
1   Sat 28 Jan          
2   Ping: xx            
3   Download: xx            
4   Upload: xx          
5   Sat 28 Jan          
6   Ping: xx            
7   Download: xx            

有人可以指出为什么它在爆炸后没有填充表,然后正确地存储在数据库中。谢谢

4

1 回答 1

2

日志文件包含以下内容:

2017 年 1 月 31 日星期二 20:00:01 UTC

Ping: xx.xxx 毫秒

下载:xx.xx Mbit/s

上传:xx.xx Mbit/s

2017 年 1 月 31 日星期二 20:00:01 UTC

Ping: xx.xxx 毫秒

下载:xx.xx Mbit/s

上传:xx.xx Mbit/s

它继续......所以每一行都有一段数据,每4行(日期,ping,下载,上传)是一个“组”。

在您的代码中,您有:

$arrEx = explode('\n',fgets($f)); 

fgets - 返回一行。

所以你实际上在做:

1轮循环:$arrEx = explode('\n', "Tue 31 Jan 20:00:01 UTC 2017");

第 2 轮循环:$arrEx = explode('\n', "Ping: xx.xxx ms"); ... ...

你应该做的是:

    $arr_to_insert = array();
    $line = 1;    
// Read line by line until end of file
    while (!feof($f)) { 
       if($line == 1){
          $group = array();
       }

       $group[] = fgets($f);


       if($line == 4){
         echo '<tr><td name="date">' . $group[0] . '</td><td name="ping">' . $group[1] . '</td><td name="download">' . $group[2] . '</td><td name="upload">' . $group[3] . '</td></tr>';

         //reset lines group
         $arr_to_insert[] = $group;
         $line = 1;
         unset($group);
       } else {
         $line++;
       }
    }
于 2017-02-01T14:46:12.207 回答