РЕДАКТИРОВАТЬ: 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();
}
?>