[Приложение] Open Hardware Monitor

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Мониторинг системных ресурсов локально и через сеть

Сообщение Alex » Чт янв 10, 2013 11:52 am

Проблема есть 100%. Пробую своими силами понять что не так. Сейчас рабочая гипотеза, что проблема не в RETURN-ах, а в foreach.

Чтобы продвинуться дальше в решении этой проблемы мне нужно понять

---------------------------------------------------------------
как можно вызвать функцию и сразу вывалиться из метода? Каков механизм этого явления (теоретически)
---------------------------------------------------------------
Но return'ы можно вообще убрать
Сначала впал в ступор, :shock: потом дошло. Попробую на практике.
raptorialfungus
Сообщения: 75
Зарегистрирован: Чт ноя 29, 2012 4:13 pm
Благодарил (а): 0
Поблагодарили: 9 раз

Re: Мониторинг системных ресурсов локально и через сеть

Сообщение raptorialfungus » Чт янв 10, 2013 2:18 pm

Alex писал(а):Проблема есть 100%. Пробую своими силами понять что не так. Сейчас рабочая гипотеза, что проблема не в RETURN-ах, а в foreach.
В смысле зацикливается и дальше выполнение не происходит ...
В идеале бы конечно надо вставить debmes и распечатывать все ветки дерева, по которым пробегается рекурсивная функция и будет видно, зависает или нет.
Alex писал(а):Чтобы продвинуться дальше в решении этой проблемы мне нужно понять

---------------------------------------------------------------
как можно вызвать функцию и сразу вывалиться из метода? Каков механизм этого явления (теоретически)
---------------------------------------------------------------
Без понятия :(

Кстати, я применил рекурсивную функцию для унификации процедуры вытаскивания данных.
По большому счету, если принять во внимание, что железо наблюдаемого компьютера меняться не будет, то мы можем обращаться к конкретном значению всего одной строкой! Типа $value = $json->объект->объект['id']; Надо только правильно путь построить ;)
Приаттачьте Ваш data.json - гляну.
Андрей
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Мониторинг системных ресурсов локально и через сеть

Сообщение Alex » Чт янв 10, 2013 4:34 pm

RETURN-ы не причём. Без них тоже самое.

Обнаруживается взаимовлияние вызовов функции. Такое впечатление, что $json меняется или меняется указатель текущего положения в $json. Или ещё что.

Пример:
--------------------
//вызов1 (закомментирован)
вызов2 ок
вызов3 ок
вызов4 ок
--------------------
вызов1 ок
вызов2 ок
вызов3 ок
вызов4 <--- вылет
Приаттачьте Ваш data.json - гляну.
Ок.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Мониторинг системных ресурсов локально и через сеть

Сообщение Alex » Чт янв 10, 2013 5:27 pm

А вот вызовы. Все вместе никак не проходят.

searchJson($json,'18');
searchJson($json,'36');
searchJson($json,'48');
searchJson($json,'24');
searchJson($json,'27');
searchJson($json,'32');
searchJson($json,'17');
searchJson($json,'50');
Вложения
data.zip
data.json
(1.18 КБ) 338 скачиваний
raptorialfungus
Сообщения: 75
Зарегистрирован: Чт ноя 29, 2012 4:13 pm
Благодарил (а): 0
Поблагодарили: 9 раз

Re: Мониторинг системных ресурсов локально и через сеть

Сообщение raptorialfungus » Чт янв 10, 2013 9:53 pm

Ну, у меня всё получилось. Можно напрямую обращаться к значениям.
Я создал "скелета" для разных Ваших железок. Если вдруг будет опять что-то непонятно, то поясню дальше.
Я создал тестовый сценарий и вызывал его из браузера, чтобы сразу отслеживать значения массивов.

Код: Выделить всё

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'};



Андрей
Андрей
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Мониторинг системных ресурсов локально и через сеть

Сообщение Alex » Чт янв 10, 2013 10:33 pm

Спасибо, попробую поразбираться с новым вариантом.


А я тем временем пытался понять почему не работает функция.

Код: Выделить всё

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 что-то не то выдаёт.
raptorialfungus
Сообщения: 75
Зарегистрирован: Чт ноя 29, 2012 4:13 pm
Благодарил (а): 0
Поблагодарили: 9 раз

Re: Мониторинг системных ресурсов локально и через сеть

Сообщение raptorialfungus » Чт янв 10, 2013 10:41 pm

Alex писал(а):А я тем временем пытался понять почему не работает функция.
Ну там не виснет, а просто массив пустой, наверное. В любом случае Debmes'ом смотреть надо значения $obj, $item, $child. Вернее даже надо не Debmes'ом, а print_r'ом и просматривать в браузере отладочную инфу. Debmes не позволяет массивы просматривать, насколько я помню.

Андрей
Андрей
raptorialfungus
Сообщения: 75
Зарегистрирован: Чт ноя 29, 2012 4:13 pm
Благодарил (а): 0
Поблагодарили: 9 раз

Re: Мониторинг системных ресурсов локально и через сеть

Сообщение raptorialfungus » Чт янв 10, 2013 10:58 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');
Увы, у меня всё прекрасно проходит и ничего не виснет.
Вот только у айтемов с 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
Вот так :( Хотел добить проблему, а у меня её и нет, как и не было.

Андрей
Андрей
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Мониторинг системных ресурсов локально и через сеть

Сообщение Alex » Чт янв 10, 2013 11:25 pm

Взял Ваш json, взял Ваш код и всё OK.
А у меня дефект ярко выражен. Не то что то есть, то нет, а чётко воспроизводится от раза к разу. Остаётся предположить влияние какого то фактора, который у меня есть, а у вас нет (код то одинаковый).

Первый кандидат на проверку — у меня метод OnNewMinute, а у вас — скрипт.
Второй — у меня динамически меняющийся json, а у вас — статический.

Может это как то влияет, попробую проверить.
raptorialfungus
Сообщения: 75
Зарегистрирован: Чт ноя 29, 2012 4:13 pm
Благодарил (а): 0
Поблагодарили: 9 раз

Re: Мониторинг системных ресурсов локально и через сеть

Сообщение raptorialfungus » Чт янв 10, 2013 11:41 pm

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 минут подряд.

Андрей
Андрей
Ответить