Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2023, 15:18   #1
Dima170792
Пользователь
 
Аватар для Dima170792
 
Регистрация: 04.04.2011
Сообщений: 76
По умолчанию PHP парсинг результатов Json

Приветствую, помогите пожалуйста разобраться с с таким вот приколом:

выполняю обращение к Zabbix API таким вот образом:

Код:
<?php

$header=array('Content-Type:application/json-rpc');
$params=array("jsonrpc" => "2.0","method" => "user.login","params" => array("user" => "Admin","password" => "zabbix"),"id" => 1);
$params_json=json_encode($params);
$API_URL = 'https://myzabbix.domen.tut/api_jsonrpc.php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $API_URL);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params_json);
$SESSION=json_decode(curl_exec($ch))->result;
$params=array("jsonrpc"=>"2.0","method"=>"item.get","params"=>array("output"=>"extend", "filter"=>array("hostid"=> "10575",)),"auth"=>$SESSION,"id"=>1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
$retval = curl_exec($ch);
curl_close($ch);
$result = json_decode($retval);

echo '<pre>'; 
print_r($result);
echo '<pre>'; 


?>

на выходе получается что то вроде такого:

Код:
stdClass Object
(
    [jsonrpc] => 2.0
    [result] => Array
        (
            [0] => stdClass Object
                (

[13] => stdClass Object
                (
                    [itemid] => 51254
                    [type] => 0
                    [snmp_oid] => 
                    [hostid] => 10575
                    [name] => Host name of Zabbix agent running
                    [key_] => agent.hostname
                    [delay] => 1h
                    [history] => 1w
                    [trends] => 0
                    [status] => 0
                    [value_type] => 1
                    [trapper_hosts] => 
                    [units] => 
                    [formula] => 
                    [logtimefmt] => 
                    [templateid] => 45003
                    [valuemapid] => 0
                    [params] => 
                    [ipmi_sensor] => 
                    [authtype] => 0
                    [username] => 
                    [password] => 
                    [publickey] => 
                    [privatekey] => 
                    [flags] => 0
                    [interfaceid] => 23
                    [description] => 
                    [inventory_link] => 0
                    [lifetime] => 30d
                    [evaltype] => 0
                    [jmx_endpoint] => 
                    [master_itemid] => 0
                    [timeout] => 3s
                    [url] => 
                    [query_fields] => Array
                        (
                        )

                    [posts] => 
                    [status_codes] => 200
                    [follow_redirects] => 1
                    [post_type] => 0
                    [http_proxy] => 
                    [headers] => Array
                        (
                        )

                    [retrieve_mode] => 0
                    [request_method] => 0
                    [output_format] => 0
                    [ssl_cert_file] => 
                    [ssl_key_file] => 
                    [ssl_key_password] => 
                    [verify_peer] => 0
                    [verify_host] => 0
                    [allow_traps] => 0
                    [uuid] => 
                    [state] => 0
                    [error] => 
                    [parameters] => Array
                        (
                        )

                    [lastclock] => 1676632458
                    [lastns] => 345547182
                    [lastvalue] => HV6999 HOST
                    [prevvalue] => HV6999 HOST
                )
 [38] => stdClass Object
                (
                    [itemid] => 51241
                    [type] => 3
                    [snmp_oid] => 
                    [hostid] => 10575
                    [name] => ICMP ping
                    [key_] => icmpping
                    [delay] => 10
                    [history] => 1w
                    [trends] => 365d
                    [status] => 0
                    [value_type] => 3
                    [trapper_hosts] => 
                    [units] => 
                    [formula] => 
                    [logtimefmt] => 
                    [templateid] => 27067
                    [valuemapid] => 12
                    [params] => 
                    [ipmi_sensor] => 
                    [authtype] => 0
                    [username] => 
                    [password] => 
                    [publickey] => 
                    [privatekey] => 
                    [flags] => 0
                    [interfaceid] => 23
                    [description] => 
                    [inventory_link] => 0
                    [lifetime] => 30d
                    [evaltype] => 0
                    [jmx_endpoint] => 
                    [master_itemid] => 0
                    [timeout] => 3s
                    [url] => 
                    [query_fields] => Array
                        (
                        )

                    [posts] => 
                    [status_codes] => 200
                    [follow_redirects] => 1
                    [post_type] => 0
                    [http_proxy] => 
                    [headers] => Array
                        (
                        )

                    [retrieve_mode] => 0
                    [request_method] => 0
                    [output_format] => 0
                    [ssl_cert_file] => 
                    [ssl_key_file] => 
                    [ssl_key_password] => 
                    [verify_peer] => 0
                    [verify_host] => 0
                    [allow_traps] => 0
                    [uuid] => 
                    [state] => 0
                    [error] => 
                    [parameters] => Array
                        (
                        )

                    [lastclock] => 1676634663
                    [lastns] => 53437750
                    [lastvalue] => 1
                    [prevvalue] => 1
                )

нужно что бы по включу [key_] => agent.hostname в <h2></h2> на странице выводилось значение [prevvalue] ( в примере HV6999 HOST) , ну и по ключу [key_] => icmpping в <span></span> выводилось значение [lastvalue] => ( в примере 1) .

с json дружу плохо, и не нашел толковых примеров - как правильно спарсить данные и вывести нужные на странице.


Заранее Вам благодарен
Dima170792 вне форума Ответить с цитированием
Старый 17.02.2023, 15:26   #2
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 484
По умолчанию

Код:
$result = json_decode($retval, true);
Valick вне форума Ответить с цитированием
Старый 17.02.2023, 15:31   #3
Dima170792
Пользователь
 
Аватар для Dima170792
 
Регистрация: 04.04.2011
Сообщений: 76
По умолчанию

Valick, если правильно понимаю - это не меняет вывод данных. мне нужно что бы вместо простыни
Код:
stdClass Object
(
    [jsonrpc] => 2.0
    [result] => Array
        (
            [0] => stdClass Object
                (

[13] => stdClass Object
                (
                    [itemid] => 51254
                    [type] => 0
                    [snmp_oid] => 
                    [hostid] => 10575
                    [name] => Host name of Zabbix agent running
                    [key_] => agent.hostname
                    [delay] => 1h
                    [history] => 1w
                    [trends] => 0
                    [status] => 0
                    [value_type] => 1
                    [trapper_hosts] => 
                    [units] => 
                    [formula] => 
                    [logtimefmt] => 
                    [templateid] => 45003
                    [valuemapid] => 0........
выводило <h2>HV6999 HOST</h2> <span>1</span>
Dima170792 вне форума Ответить с цитированием
Старый 17.02.2023, 15:45   #4
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 484
По умолчанию

Цитата:
Сообщение от Dima170792 Посмотреть сообщение
Valick, если правильно понимаю - это не меняет вывод данных.
Если я правильно понял, то код вы не запускали?
Или запускали но не смогли отличить объект, от ассоциативного массива?

В целом скорее всего у Zabbix можно "спросить" более конкретно, что бы не отвечал простынёй. Но вот уж чего-чего, а документацию по api Zabbix мне читать некогда.
Valick вне форума Ответить с цитированием
Старый 17.02.2023, 15:54   #5
Dima170792
Пользователь
 
Аватар для Dima170792
 
Регистрация: 04.04.2011
Сообщений: 76
По умолчанию

Valick, да, запускал, он мне выдал простыню, а как вместо простыни спарсить нужное - не получается((
Dima170792 вне форума Ответить с цитированием
Старый 17.02.2023, 15:57   #6
Dima170792
Пользователь
 
Аватар для Dima170792
 
Регистрация: 04.04.2011
Сообщений: 76
По умолчанию

Valick, В целом скорее всего у Zabbix можно "спросить" более конкретно, что бы не отвечал простынёй. - можно, но мне важно как раз из массива по одному хосту выделить нужное из пачки данных, что бы не делать 10 запросов к хосту - условно для каждого айтема
Dima170792 вне форума Ответить с цитированием
Старый 17.02.2023, 16:17   #7
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

учись обращаться как к полям объекта так и элементам многомерного массива

для данного конкретного примера

Цитата:
echo $result->result[0][13]->prevvalue
если же надо в любом произвольном ответе найти, если там есть
[key_] => agent.hostname

то посложнее - перебираете массив, в нем массив - ищете если такое поле и равон ли оно значению - тогда выводите...

и вам верно сказали - наверняка есть запросы конкретные - которые дадут гораздо меньший объем информации из которого нужно выбрать
ADSoft вне форума Ответить с цитированием
Старый 17.02.2023, 16:43   #8
Dima170792
Пользователь
 
Аватар для Dima170792
 
Регистрация: 04.04.2011
Сообщений: 76
По умолчанию

ADSoft, пробовал Ваш вариант, а так же по аналогии с https://ru.stackoverflow.com - получаю пустой вывод
Dima170792 вне форума Ответить с цитированием
Старый 17.02.2023, 17:47   #9
Dima170792
Пользователь
 
Аватар для Dima170792
 
Регистрация: 04.04.2011
Сообщений: 76
По умолчанию

Спасибо всем кто откликнулся.

Ниже рабочая версия скрипта
Код:
<?php
 
$header=array('Content-Type:application/json-rpc');
$params=array("jsonrpc" => "2.0","method" => "user.login","params" => array("user" => "Admin","password" => "zabbix"),"id" => 1);
$params_json=json_encode($params);
$API_URL = 'https://myzabbix.domen.tut/api_jsonrpc.php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $API_URL);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params_json);
$SESSION=json_decode(curl_exec($ch))->result;
$params=array("jsonrpc"=>"2.0","method"=>"item.get","params"=>array("output"=>"extend", "filter"=>array("hostid"=> "10671",)),"auth"=>$SESSION,"id"=>1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
$retval = curl_exec($ch);
curl_close($ch);
$result = json_decode($retval, true);
foreach ($result['result'] as $result1){
    if(strpos($result1['key_'],'agent.hostname')!== false){
        echo '<pre>'; 
        print_r('HOST NAME: ' . $result1['lastvalue']);
        echo '<pre>';  
    }
    elseif (strpos($result1['name'],'ICMP ping')!== false){
        echo '<pre>'; 
        $status = $result1['lastvalue'];
        if ($status == '1') {
            $status = 'Ok';
        } else { $status = 'PIZDA'; }
        echo 'STATUS '.$status;
        echo '<pre>';
    }
}



?>


PS:
почему не отдельный запрос за каждым айтемом - что бы не грузить сервак, с 500 айтемами в минуту - еще и обрашениями своего кода - меньше запросов к серверу заббикса - меньше нагрузка на его железо
Dima170792 вне форума Ответить с цитированием
Старый 17.02.2023, 17:52   #10
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 484
По умолчанию

Цитата:
Сообщение от Dima170792 Посмотреть сообщение
меньше запросов к серверу заббикса - меньше нагрузка на его железо
это сильно зависит от самого запроса
Valick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг JSON FunnyNeo C# (си шарп) 3 23.09.2022 13:07
парсинг json niockasd Общие вопросы Delphi 0 22.09.2018 22:42
Парсинг JSON istory Общие вопросы Delphi 0 28.11.2017 19:16
Парсинг string в БД. json. c# zink Общие вопросы .NET 1 05.06.2016 10:02
Парсинг массива в json C_R_E_S_C_H Общие вопросы Delphi 0 12.05.2012 23:39