更有效的方式来存储MikroTik IP记帐数据吗?

时间:2018-08-02 19:24:08

标签: php mysql api mikrotik

我之前有一个关于如何执行此脚本的问题,并想出了一种方法,但是我不太确定是否应使用此方法。 另一则帖子here可用。

如果有比我以前做的更快或更有效的运行脚本的方式,有人可以指出正确的方向吗?

<?php
    //Require admin
    require_once("inc/admin.php");
    require_once ("../includes/routeros_api.class.php");

    //SET 
    $ip = "10.100.1.1";


    //Connect to MikroTik API
    $API = new RouterosAPI();
    $API->debug = $config['api']['debug'];
    if (!$API->connect($ip, $config['api']['username'], $config['api']['password'])) {
        echo "Could not connect to RouterOS API";
    } else {
        $API->write('/ip/accounting/snapshot/take',true);
        $READ = $API->read(false);
        $ARRAY = $API->parseResponse($READ);

$API->write('/ip/accounting/snapshot/print',true);
$READ = $API->read(false);
$ARRAY = $API->parseResponse($READ);

foreach($ARRAY as $ACCOUNTING) {
    $ip_src = $ACCOUNTING['src-address'];
    $ip_dst = $ACCOUNTING['dst-address'];
    $bytes = $ACCOUNTING['bytes'];

    //Check if ip in use UPLOAD
    $query = "SELECT id, ipv4 FROM services WHERE ipv4='$ip_src' AND deleted !='1'";
    $result = mysqli_query($conn, $query);
    $row = mysqli_fetch_array($result);

    if(mysqli_num_rows($result) > 0) {
        $service_id = $row['id'];
        //Update Download Traffic
        $check_if_exist_query = "SELECT * FROM traffic_counters WHERE service_id='$service_id' AND date=CURRENT_DATE()";
        $check_result = mysqli_query($conn, $check_if_exist_query);
        $check_num_rows = mysqli_num_rows($check_result);

        if($check_num_rows == 0) {
            $add_query = "INSERT INTO traffic_counters (service_id, upload_bytes, date) VALUES ('$service_id', '$bytes', CURRENT_DATE());";
            $add_result = mysqli_query($conn, $add_query);
        } else {
            $update_query = "UPDATE traffic_counters SET 
                                upload_bytes = upload_bytes + $bytes
                                WHERE service_id='$service_id' AND date=CURRENT_DATE();
                            ";
            $update_result = mysqli_query($conn, $update_query);
        }
    }

    //Check if ip in use DOWNLOAD
    $query = "SELECT id, ipv4 FROM services WHERE ipv4='$ip_dst' AND deleted !='1'";
    $result = mysqli_query($conn, $query);
    $row = mysqli_fetch_array($result);

    if(mysqli_num_rows($result) > 0) {
        $service_id = $row['id'];
        //Update Download Traffic
        $check_if_exist_query = "SELECT * FROM traffic_counters WHERE service_id='$service_id' AND date=CURRENT_DATE()";
        $check_result = mysqli_query($conn, $check_if_exist_query);
        $check_num_rows = mysqli_num_rows($check_result);

        if($check_num_rows == 0) {
            $add_query = "INSERT INTO traffic_counters (service_id, download_bytes, date) VALUES ('$service_id', '$bytes', CURRENT_DATE());";
            $add_result = mysqli_query($conn, $add_query);
        } else {
            $update_query = "UPDATE traffic_counters SET 
                                download_bytes = download_bytes + $bytes
                                WHERE service_id='$service_id' AND date=CURRENT_DATE();
                            ";
            $update_result = mysqli_query($conn, $update_query);
        }
    }
}
       $API->disconnect();
}
?>

1 个答案:

答案 0 :(得分:0)

1。)。您可以从“简化”插入查询开始:

只有一些变量$ INSERT_VALUES并循环执行

$INSERT_VALUES.=", ('$service_id', '$bytes', CURRENT_DATE())";

循环后,您只能对数据库执行一次插入(仅一次查询):

$add_query = "INSERT INTO traffic_counters (service_id, upload_bytes, date) VALUES INSERT_VALUES"; 

2。)。如果行数很大,使用UPDATE是个坏主意,但是在这种使用方式下,没有办法解决此问题。您可以尝试在mysql START TRANSACTION;上调用,并在所有更新后调用COMMIT;

3。)在大型数据库SELECT ... WHERE ...上,比将所有数据加载到php数组然后通过array_search或使用创建数组的好方法找到所需的行要慢(例如$ DATA [service_id] [“ colunm”] = $ value)