РЕДАКТИРОВАТЬ: MikroTik IP учета через PHP API только хранение информации, указанной в базе данных

Я работаю над сценарием для импорта учетных данных MikroTik IP в MySQL, только если в базе данных существует строка, содержащая IP-адрес.

У меня есть стол services с колоннами id(идентификатор услуги) и ipv4(служебный IP-адрес), который содержит строки IP-адресов, для которых я хочу сохранить учетные данные.

У меня тогда есть другой стол traffic_counters с колоннами id, service_id, download_bytes, upload_bytes а также date

В настоящее время при получении учетных данных из API, если я использую print_r($ARRAY)Я получаю вывод как:

Array ( [0] => Array ( [.id] => *0 [src-address] => 10.2.1.2 [dst-address] => 10.1.1.20 [packets] => 4 [bytes] => 4528 ) [1] => Array ( [.id] => *1 [src-address] => 10.1.1.20 [dst-address] => 18.196.198.94 [packets] => 2 [bytes] => 80 ) [2] => Array ( [.id] => *2 [src-address] => 10.2.1.2 [dst-address] => 10.100.1.1 [packets] => 16 [bytes] => 2216 )

Я только на этом этапе хочу отслеживать IP-адрес и байты, переданные. Раньше я использовал сценарий, который сохраняет все учетные данные в таблицу, а затем сортирует их в новую таблицу, а затем очищает, когда завершает, но этот процесс занимает слишком много времени, иногда сценарий может выполняться в течение двух часов, прежде чем вводить все данные временно в таблицу.

Мой предыдущий запрос был

           SELECT 
                ip_address, 
                SUM(upload_bytes) as upload_bytes, 
                SUM(download_bytes) as download_bytes, 
                SUM(upload_bytes + download_bytes) as total_bytes, 
                timeanddate 
            FROM 
                (
                    (
                        SELECT 
                            ip_accounting.src_address as ip_address, 
                            SUM(ip_accounting.bytes) AS upload_bytes, 
                            0 as download_bytes, 
                            ip_accounting.accounting_router_ip, 
                            ip_accounting.accounting_router_id, 
                            timeanddate 
                        FROM 
                            ip_accounting 
                        GROUP BY 
                            src_address
                    ) 
                    UNION ALL 
                        (
                            SELECT 
                                ip_accounting.dst_address as ip_address, 
                                0 AS upload_bytes, 
                                SUM(ip_accounting.bytes) as download_bytes, 
                                ip_accounting.accounting_router_ip, 
                                ip_accounting.accounting_router_id, 
                                timeanddate 
                            FROM 
                                ip_accounting 
                            GROUP BY 
                                dst_address
                        )
                ) a 
            GROUP BY 
                ip_address,
                YEAR(timeanddate),
                MONTH(timeanddate),
                DAY(timeanddate) 
            ORDER BY 
                ip_address

Таким образом, в основном принимает исходный IP-адрес для загрузки и целевой IP-адрес в качестве загрузки

Мне нужно изменить скрипт, чтобы получать все данные через API, как я упоминал в начале, и запускать его через цикл foreach, чтобы найти соответствующие IP-адреса, которые находятся в services.ipv4 таблицы / столбца, а затем вставьте / обновите его в traffic_counters Таблица

У меня возникла небольшая проблема с тем, как использовать команду foreach для этого типа вывода массива, и я не очень уверен, в каком порядке кодировать скрипт.

Мой текущий скрипт выполняет ежедневный учет, который должен оставаться прежним, например. каждое обновление учета IP будет добавлять байты к существующим traffic_counters таблица или вставьте новую строку, если дата не является текущей.

Пока я пробовал

$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['0']['.id'] as $ACCOUNTING) {
        $id = $ARRAY['0']['.id'];
        $ip_src = $ARRAY['0']['src-address'];
        $ip_dst = $ARRAY['0']['dst-address'];
        $bytes = $ARRAY['0']['dst-address'];
    }

Но я получаю Warning: Invalid argument supplied for foreach() in /opt/WispManager/html/admin/test.php on line 24

Может кто-нибудь, пожалуйста, помогите мне разобраться, как сделать этот процесс наиболее эффективным способом, потому что я заполняю свой мозг всем этим процессом, я не хочу хранить какие-либо временные данные в mysql.

Я пытаюсь скопировать так же, как Splnyx ведет учет IP.


РЕДАКТИРОВАТЬ: я немного поиграл и выяснил, как сделать цикл foreach с массивом и получил все работает, как я хотел. Я просто не уверен, что мой способ сделать это очень эффективен, может кто-нибудь, пожалуйста, проверьте мой код для меня и укажите мне правильное направление, если есть более простое / быстрое решение.

Мой новый скрипт:

<?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();
}
?>

0 ответов

Другие вопросы по тегам