我的场景如下:我有一个解析日志文件(超过2000行)并在MySQL中存储表的函数。
表格格式如下(行):id,name,realaddress,virtualaddress,bytessent,bytesreceived,time,blockedstatus。哪个“blockedstatus”通过用户交互更改并保存为“true”或“false”。 如果给定的comName在日志中,也在MySQL表中,则表示它是“已连接”的。如果给定的comName在MySQL表中但不在日志中,则表示它是“断开连接”。
此日志文件每2分钟更新一次,这意味着每两分钟我将不得不进行所有这些检查,因为:
该功能将每分钟由crontab执行。
strptime
答案 0 :(得分:0)
我刚刚调整了你的功能。我添加了update语句,以防logentry已经在数据库中。此外,我更改了您的查询以使用预准备语句,因为它们正在执行格式良好的语句。
由于我不熟悉mysqli,可能会出现小错误,但这应该会告诉您如何处理问题。
function ovpnParser(mysqli $con, $pathlog) {
$handle = fopen($pathlog, "r");
$inclients = false;
$stmtCheckIfExist = mysqli_prepare($con, 'SELECT comName FROM vpn WHERE comName = ?');
mysqli_stmt_bind_param($stmtCheckIfExist, "S", $comName);
$stmtInsert = mysqli_prepare($con, 'INSERT INTO vpn (comName, realAddr, virtAddr, byR, byS, since, sinstamp, blockstatus)
VALUES (?, ?, ?, ?, ?, ?, ?, "true")');
mysqli_stmt_bind_param($stmtInsert, "SSSSSSS", $comName, $realAddr, $virtAddr, $byR, $byS, $since, $sinstamp);
$stmtUpdate = mysqli_prepare($con, 'UPDATE vpn SET blockstatus = "false" WHERE comName = ?');
mysqli_stmt_bind_param($stmtUpdate, "S", $comName);
while (!feof($handle)) {
$line = fgets($handle, 4096);
if (substr($line, 0, 11) == "CLIENT_LIST") {
if (preg_match("/CLIENT_LIST\t{1,}UNDEF(.*)UNDEF/", $line)) {
$inclients = false;
} else {
$inclients = true;
}
}
if ($inclients) {
preg_match("/CLIENT_LIST(.*)UNDEF/", $line, $conteudo);
$partes = preg_split("/\t{1,}/", trim($conteudo[1]));
$comName = $partes[0];
$realAddr = $partes[1];
$virtAddr = $partes[2];
$byR = $partes[3];
$byS = $partes[4];
$since = $partes[5];
$sinstamp = $partes[6];
mysqli_stmt_execute($stmtCheckIfExist);
$result = mysqli_stmt_get_result($stmtCheckIfExist);
$numeroDeLinhas = mysqli_num_rows($result);
if ($numeroDeLinhas === 0) {
mysqli_stmt_execute($stmtInsert);
} else {
mysqli_stmt_execute($stmtUpdate);
}
}
$inclients = false;
}
}