比较MySQL表和日志文件中的数据

时间:2016-07-04 17:48:12

标签: php mysql

我的场景如下:我有一个解析日志文件(超过2000行)并在MySQL中存储表的函数。

表格格式如下(行):id,name,realaddress,virtualaddress,bytessent,bytesreceived,time,blockedstatus。哪个“blockedstatus”通过用户交互更改并保存为“true”或“false”。 如果给定的comName在日志中,也在MySQL表中,则表示它是“已连接”的。如果给定的comName在MySQL表中但不在日志中,则表示它是“断开连接”。

此日志文件每2分钟更新一次,这意味着每两分钟我将不得不进行所有这些检查,因为:

  • 此文件可以包含需要插入表格的新comName。
  • 如果comName在表中但不在日志中,我需要在MySQL表中记录为断开连接。

该功能将每分钟由crontab执行。

strptime

1 个答案:

答案 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;
    }
}