【问题标题】:More efficient way of storing MikroTik IP accounting data?存储 MikroTik IP 记帐数据的更有效方式?
【发布时间】:2018-08-02 19:24:07
【问题描述】:

我之前有一个关于如何执行此脚本的问题,并且已经找到了一种方法,但我不太确定是否应该使用这种方法。 其他帖子可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();
}
?>

【问题讨论】:

  • 您的服务表有多大?通过在循环之外读取它并将所需的数据保存在数组中以便在循环内进行检查,您将受益。此外,请考虑使用带有 ON DUPLICATE KEY UPDATE 选项的 INSERT,而不是担心某些东西是否已经存在。当然,这取决于您的表结构,但它肯定值得 IMO 研究。

标签: php mysql api mikrotik


【解决方案1】:

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]["counm"]=$value)

【讨论】:

  • 你有改变我当前编码的例子吗?
猜你喜欢
  • 1970-01-01
  • 2011-10-31
  • 2015-04-30
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
相关资源
最近更新 更多