Страница 4 из 7
Re: Мониторинг системных ресурсов локально и через сеть
Добавлено: Чт янв 10, 2013 11:52 am
Alex
Проблема есть 100%. Пробую своими силами понять что не так. Сейчас рабочая гипотеза, что проблема не в RETURN-ах, а в foreach.
Чтобы продвинуться дальше в решении этой проблемы мне нужно понять
---------------------------------------------------------------
как можно вызвать функцию и сразу вывалиться из метода? Каков механизм этого явления (теоретически)
---------------------------------------------------------------
Но return'ы можно вообще убрать
Сначала впал в ступор,

потом дошло. Попробую на практике.
Re: Мониторинг системных ресурсов локально и через сеть
Добавлено: Чт янв 10, 2013 2:18 pm
raptorialfungus
Alex писал(а):Проблема есть 100%. Пробую своими силами понять что не так. Сейчас рабочая гипотеза, что проблема не в RETURN-ах, а в foreach.
В смысле зацикливается и дальше выполнение не происходит ...
В идеале бы конечно надо вставить debmes и распечатывать все ветки дерева, по которым пробегается рекурсивная функция и будет видно, зависает или нет.
Alex писал(а):Чтобы продвинуться дальше в решении этой проблемы мне нужно понять
---------------------------------------------------------------
как можно вызвать функцию и сразу вывалиться из метода? Каков механизм этого явления (теоретически)
---------------------------------------------------------------
Без понятия
Кстати, я применил рекурсивную функцию для унификации процедуры вытаскивания данных.
По большому счету, если принять во внимание, что железо наблюдаемого компьютера меняться не будет, то мы можем обращаться к конкретном значению всего одной строкой! Типа $value = $json->объект->объект['id']; Надо только правильно путь построить
Приаттачьте Ваш data.json - гляну.
Re: Мониторинг системных ресурсов локально и через сеть
Добавлено: Чт янв 10, 2013 4:34 pm
Alex
RETURN-ы не причём. Без них тоже самое.
Обнаруживается взаимовлияние вызовов функции. Такое впечатление, что $json меняется или меняется указатель текущего положения в $json. Или ещё что.
Пример:
--------------------
//вызов1 (закомментирован)
вызов2 ок
вызов3 ок
вызов4 ок
--------------------
вызов1 ок
вызов2 ок
вызов3 ок
вызов4 <--- вылет
Приаттачьте Ваш data.json - гляну.
Ок.
Re: Мониторинг системных ресурсов локально и через сеть
Добавлено: Чт янв 10, 2013 5:27 pm
Alex
А вот вызовы. Все вместе никак не проходят.
searchJson($json,'18');
searchJson($json,'36');
searchJson($json,'48');
searchJson($json,'24');
searchJson($json,'27');
searchJson($json,'32');
searchJson($json,'17');
searchJson($json,'50');
Re: Мониторинг системных ресурсов локально и через сеть
Добавлено: Чт янв 10, 2013 9:53 pm
raptorialfungus
Ну, у меня всё получилось. Можно напрямую обращаться к значениям.
Я создал "скелета" для разных Ваших железок. Если вдруг будет опять что-то непонятно, то поясню дальше.
Я создал тестовый сценарий и вызывал его из браузера, чтобы сразу отслеживать значения массивов.
Код: Выделить всё
http://192.168.1.222/objects/?script=openhardware
Код: Выделить всё
$ch = curl_init('http://192.168.1.2:8085/data.json');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ohm = curl_exec($ch);
$json = json_decode($ohm);
$hardwares = $json -> {'Children'}[0] -> {'Children'};
$motherboard = $json -> {'Children'}[0] -> {'Children'}[0];
$motherboard_voltages = $motherboard -> {'Children'}[0] -> {'Children'}[0];
$motherboard_temperatures = $motherboard -> {'Children'}[0] -> {'Children'}[1];
$motherboard_fans = $motherboard -> {'Children'}[0] -> {'Children'}[2];
$system_temperature = $motherboard_temperatures -> {'Children'}[1] -> {'Value'};
$cpu = $json -> {'Children'}[0] -> {'Children'}[1];
$memory = $json -> {'Children'}[0] -> {'Children'}[2];
$gpu = $json -> {'Children'}[0] -> {'Children'}[3];
$hdd = $json -> {'Children'}[0] -> {'Children'}[4];
echo "<pre>";
//print_r($json);
//print_r($hardwares);
//print_r($motherboard);
//print_r($motherboard_voltages);
//print_r($motherboard_temperatures);
//print_r($motherboard_fans);
//print_r($cpu);
//print_r($hdd);
print_r($system_temperature);
echo "</pre>";
Чтобы были понятны эти json'овские навороты можно по очереди раскомментаривать мои функции
print_r
Я в примере показал, как добраться до температуры материнской платы. Естессно, можно и в одну строку без промежуточных переменных, но так красивей и понятней.
P.S. Температура винчестера:
$hdd_temperature = $hdd -> {'Children'}[0] -> {'Children'}[0] -> {'Value'};
Использованное дисковое пространство:
$hdd_usedspace = $hdd -> {'Children'}[1] -> {'Children'}[0] -> {'Value'};
Температуры корок процессора:
$cpu1_temperature = $cpu -> {'Children'}[1] -> {'Children'}[0] -> {'Value'};
$cpu2_temperature = $cpu -> {'Children'}[1] -> {'Children'}[1] -> {'Value'};
Андрей
Re: Мониторинг системных ресурсов локально и через сеть
Добавлено: Чт янв 10, 2013 10:33 pm
Alex
Спасибо, попробую поразбираться с новым вариантом.
А я тем временем пытался понять почему не работает функция.
Код: Выделить всё
function searchJson($obj, $value){
Debmes("1");
foreach($obj as $item) {
Debmes("2"); //<------------------------------------------------------------------------ проходит
foreach($item as $child) { //<-------------------------------------------------------- Тут! виснет!
Debmes("3"); //<----------------------------------------------------------------------- до этого дело не доходит
if (isset($child->id) && $child->id == $value) {
Debmes("4");
sg('ThisComputer.temp', substr($child->Value,0,strpos($child->Value,' ')));
return;
}
Debmes("88");
searchJson($child,$value);
}
}
Debmes("99");
return;
}
Такое впечатление, что либо переменная не обнуляется, либо глубина цикла слишком велика, либо json_decode что-то не то выдаёт.
Re: Мониторинг системных ресурсов локально и через сеть
Добавлено: Чт янв 10, 2013 10:41 pm
raptorialfungus
Alex писал(а):А я тем временем пытался понять почему не работает функция.
Ну там не виснет, а просто массив пустой, наверное. В любом случае Debmes'ом смотреть надо значения $obj, $item, $child. Вернее даже надо не Debmes'ом, а
print_r'ом и просматривать в браузере отладочную инфу. Debmes не позволяет массивы просматривать, насколько я помню.
Андрей
Re: Мониторинг системных ресурсов локально и через сеть
Добавлено: Чт янв 10, 2013 10:58 pm
raptorialfungus
Alex писал(а):А вот вызовы. Все вместе никак не проходят.
searchJson($json,'18');
searchJson($json,'36');
searchJson($json,'48');
searchJson($json,'24');
searchJson($json,'27');
searchJson($json,'32');
searchJson($json,'17');
searchJson($json,'50');
Увы, у меня всё прекрасно проходит и ничего не виснет.
Вот только у айтемов с id 18,36 и 48 нет значения Value.
Например, id 18 имеет только поле Text: "Pentium Dual-Core E5300"
Взял Ваш json, взял Ваш код и всё OK.
Код: Выделить всё
function searchJson($obj, $value){
foreach($obj as $item) {
foreach($item as $child) {
if (isset($child->id) && $child->id == $value) {
sg('ThisComputer.temp', substr($child->Value,0,strpos($child->Value,' ')));
sg('ThisComputer.tempText', $child->Text);
return;
}
searchJson($child,$value);
}
}
return;
}
$ch = curl_init('http://192.168.1.222/img/data.json');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ohm = curl_exec($ch);
$json = json_decode($ohm);
echo "<br>";
searchJson($json,"20");
echo "1. ".gg('ThisComputer.temp');
echo "<br>";
searchJson($json,'36');
echo "2. ".gg('ThisComputer.temp');
echo "<br>";
searchJson($json,'48');
echo "3. ".gg('ThisComputer.temp');
echo "<br>";
searchJson($json,'24');
echo "4. ".gg('ThisComputer.temp');
echo "<br>";
searchJson($json,'27');
echo "5. ".gg('ThisComputer.temp');
echo "<br>";
searchJson($json,'32');
echo "6. ".gg('ThisComputer.temp');
echo "<br>";
searchJson($json,'17');
echo "7. ".gg('ThisComputer.temp');
echo "<br>";
searchJson($json,'50');
echo "8. ".gg('ThisComputer.temp');
echo "<br>";
Результат:
Код: Выделить всё
Request: &script=openhardware2 Running script: openhardware2
1. 221
2.
3.
4. 42,0
5. 4,7
6. 46,3
7. 1082
8. 44,0
Вот так

Хотел добить проблему, а у меня её и нет, как и не было.
Андрей
Re: Мониторинг системных ресурсов локально и через сеть
Добавлено: Чт янв 10, 2013 11:25 pm
Alex
Взял Ваш json, взял Ваш код и всё OK.
А у меня дефект ярко выражен. Не то что то есть, то нет, а чётко воспроизводится от раза к разу. Остаётся предположить влияние какого то фактора, который у меня есть, а у вас нет (код то одинаковый).
Первый кандидат на проверку — у меня метод OnNewMinute, а у вас — скрипт.
Второй — у меня динамически меняющийся json, а у вас — статический.
Может это как то влияет, попробую проверить.
Re: Мониторинг системных ресурсов локально и через сеть
Добавлено: Чт янв 10, 2013 11:41 pm
raptorialfungus
Alex писал(а):Взял Ваш json, взял Ваш код и всё OK.
А у меня дефект ярко выражен. Не то что то есть, то нет, а чётко воспроизводится от раза к разу. Остаётся предположить влияние какого то фактора, который у меня есть, а у вас нет (код то одинаковый).
Первый кандидат на проверку — у меня метод OnNewMinute, а у вас — скрипт.
Второй — у меня динамически меняющийся json, а у вас — статический.
Не вопрос:
Код: Выделить всё
11.01.2013 00:37:01
Request: &object=Maintenance&op=m&m=onNewMinute
11.01.2013 00:38:01
Request: &object=ClockChime&op=m&m=onNewMinute
11.01.2013 00:38:01
1,168
11.01.2013 00:38:01
2360
11.01.2013 00:38:01
40,0
11.01.2013 00:38:02
58,0
11.01.2013 00:38:02
40,0
11.01.2013 00:38:02
49,0
11.01.2013 00:38:02
89,5
11.01.2013 00:38:02
3,264
Динамический json (специально OHM поднял) и вызов из OnNewMinute 8-ми разных параметров. Пробовал 5 минут подряд.
Андрей