我有一个应用程序将一组GPS字符串写入文本文件,如下所示:
[{" date":" 02/13/2017 19:26:00"," time":1486974360428,"经度&#34 ;:151.209900,"纬度": - 33.865143} {"日期":" 02/13/2017 19:26:13","时间&# 34;:1486974373496,"经度":151.209900,"纬度": - 33.865143} {" date":" 02/13/2017 19:26 :23""时间":1486974383539,"经度":151.209900,"纬度": - 33.865143} {"日期&#34 ;: " 02/13/2017 19:26:33"," time":1486974393449,"经度":151.209900,"纬度": - 33.865143} {" date":" 02/13/2017 19:26:43"," time":1486974403423,"经度": 151.209900,"纬度": - 33.865143} {"日期":" 02/13/2017 19:26:53","时间" :1486974413483,"经度":151.209900,"纬度": - 33.865143}]
文件始终以[]
开头和结尾。
此文件上传到
的Ubuntu服务器'filepath'/uploads/gps/'device ID'/'year-month-day'/'UTC download time'.txt
例如
/uploads/gps/12/2017-02-12/1486940878.txt
文件上传到服务器时会创建文本文件,因此每天会写入多个文件。
我想要一个方法将值写入MySQL数据库,标题为DEVICE(从文件路径获取),DATE,TIME,LONGITUDE,LATITUDE。
最初,只有我可以在服务器上运行的命令才是最好的,我最终可以从管理面板上的PHP命令运行。
我从哪里开始?
答案 0 :(得分:0)
您可以轻松地将文本提交到服务器上的PHP程序,而不是上传。它将使用JSON解码将其转换为数组,然后将每个记录保存到表中。设备ID将是脚本的参数之一。
使用这种方法可以消除很多问题,例如不导入文件两次,导入后重命名/移动文件,查找文件等。
这也意味着每次发送数据时您的数据都是最新的。
这样的脚本编写起来非常简单,但它应该内置某种类型的安全性,以防止数据被未经授权的实体发送。
这里有一些示例代码,用于处理文件并将其存储到数据库中。我已删除您需要编辑的某些信息(用户ID /密码数据库名称)。我想的还有一段时间,但仍然很短。如果您需要更多信息,请告诉我。
<?php
/* ===============================================================
Locate and parse GPS files, then store to MySQL DB.
Presumes a folder stucture of gps/device_id/date:YYYY-MM-DD.
After a file is processed and stored in the DB table, the
file is renamed with a leading "_" so it will be ignored later.
===============================================================
*/
$DS = '/'; // Directory separator character. Use '/' for Linux, '\' for windows.
// Path to folder containing device folders.
$base_folder = "./gps";
// Today's date foratted like the folders under the devices. If parameter "date" has a value, use it instead of today's date. Parameter MUST be formatted correctly.
$today = isset($_REQUEST['date']) && $_REQUEST['date'] != '' ? $_REQUEST['date'] : date('Y-m-d');
// Get a list of device folders
$device_folders = get_folders($base_folder);
// Loop through all of the device folders
$num_file_processed = 0;
foreach($device_folders as $dev_folder) {
// Check to see if there is a folder in the device folder for today.
$folder_path = $base_folder.$DS.$dev_folder.$DS.$today;
// Check if the device/date folder exists.
if(file_exists($folder_path) && is_dir($folder_path)) {
// Folder exists, get a list of files that haven't been processed.
$file_list = get_files($folder_path);
// Process the files (if any)
foreach($file_list as $filename) {
$f_path = $folder_path.$DS.$filename;
$json = file_get_contents($f_path);
// Fix the JSON -- missing "," between records.
$json = str_replace("}{","},{",$json);
$data = json_decode($json);
// Process each row of data and save to DB.
$num_saved = 0;
$rec_num = 0;
foreach($data as $recno => $rec_data) {
if(save_GPS($dev_folder,$rec_data->date,$rec_data->time,$rec_data->longitude,$rec_data->latitude)) {
$num_saved++;
}
$rec_num++;
}
// Rename file so we can ignore it if processing is done again.
if($num_saved > 0) {
$newName = $folder_path.$DS."_".$filename;
rename($f_path,$newName);
$num_file_processed++;
}
}
} else {
echo "<p>" . $folder_path . " not found.</p>\n";
}
}
echo "Processing Complete. ".$num_file_processed." files processed. ".$num_saved." records saved to db.\n";
function save_GPS($dev_id,$rec_date,$rec_time,$long,$lat) {
$server = "localhost";
$uid = "your_db_user_id";
$pid = "your_db_password";
$db_name = "your_database_name";
$qstr = "";
$qstr .= "INSERT INTO `gps_log`\n";
$qstr .= "(`device`,`date`,`time`,`longitude`,`latitude`)\n";
$qstr .= "VALUES\n";
$qstr .= "('".$dev_id."','".$rec_date."','".$rec_time."','".$long."','".$lat."');\n";
$db = mysqli_connect($server,$uid,$pid,$db_name);
if(mysqli_connect_errno()) {
echo "Failed to connect to MySQL server: " . mysqli_connect_errno() . " " . mysqli_connect_error() . "\n";
return false;
}
// Connected to DB, so save the record
mysqli_query($db,$qstr);
mysqli_close($db);
return true;
}
function get_folders($base_folder) {
$rslts = array();
$folders = array_map("htmlspecialchars", scandir($base_folder));
foreach($folders as $folder) {
// Ignore files and folders that start with "." (ie. current folder and parent folder references)
if(is_dir($base_folder."/".$folder) && substr($folder,0,1) != '.') {
$rslts[] = $folder;
}
}
return $rslts;
}
function get_files($base_folder) {
$rslts = array();
$files = array_map("htmlspecialchars", scandir($base_folder));
foreach($files as $file) {
// Ignore files and folders that start with "." (ie. current folder and parent folder references), or "_" (files already processed).
if(!is_dir($file) && substr($file,0,1) != '.' && substr($file,0,1) != '_') {
$rslts[] = $file;
}
}
return $rslts;
}