2014-01-28 33 views
0

我已經安裝了lm-sensors,我想知道是否有某種綁定從PHP內部訪問這些驅動程序?我想要訪問各種服務器上的溫度讀數,並使用pushover來通知我的iPhone,如果事情在多個遠程服務器機房中過熱。我還有一些web enabled power switches,我的服務器可以在緊急情況下自動關閉設備。我有其他幾個監控系統用批處理PHP編寫,所以我寧願用PHP編寫,所以我可以重用現有的代碼。另外,這是我最熟悉的語言。我想我可以使用exec來運行傳感器並解析輸出,但如果其他人已經編寫了一個用於訪問主板溫度讀數的PHP類,我想盡可能使用它。如何在Debian上使用PHP讀取主板溫度讀數?

+0

也許通過stdin:// –

+1

如果您運行的是SNMP,PHP有一個[實現它](http://www.php .net/manual/en/book.snmp.php),這將解決您對改變輸出格式和多個傳感器的顧慮。你也可以使用像cacti或zabbix這樣的完整軟件包,定義你的閾值,並在腳本觸發時運行腳本。 – Wrikken

+0

不幸的是,我對SNMP一無所知,儘管我可能應該這樣做。我還發現,在所有有問題的機器上都存在像/ sys/class/thermal/thermal_zone0這樣的目錄,所以也許我可以通過我的PHP腳本來讀取它們。我能否依賴這些價值的正確性? – fastfinge

回答

0

的解決方案,我結束了同正想使用PHP通過/ sys/class/thermal/thermal_zone2/temp讀取/ sys/class/thermal/thermal_zone0/temp的內容。每個文件都包含一個數字,即千分之一度的溫度。這是Linux內核的標準部分,並且這似乎是一個標準的內核函數,所以它應該在大多數較新的Linux系統中保持可用。它在我測試過的6號機上可用。

0

不經得起考驗的,但你可以安裝一個軟件包像lm-sensors,然後就通過高管或類似的東西運行命令sensors和打印輸出

但肯定有這樣做的更好的方法。

編輯

我想你可以登錄一般的CPU或任何的溫度和剛讀在PHP該日誌文件和打印輸出

+0

是的,我可以使用exec,就像我在我的問題中所說的那樣。但是這意味着編寫代碼來解析傳感器輸出,並希望它永遠不會改變。而且,我的各種不同的機器具有不同數量的傳感器,具有不同的傳感器名稱,使事情稍微複雜一些。這就是爲什麼我希望有人編寫了php綁定到lm-sensors庫,或者是一個php類來解析這個輸出,我不需要維護自己。 – fastfinge

0

我寫傳感器的輸出解析器,

function read_sensors(): array { 
    if (0) { 
     // for debugging/testing 
     $stdout = getStdOut(); 
    } else { 
     exec ("sensors -u", $stdout, $ret); 
     if ($ret !== 0) { 
      throw new \RuntimeException ('sensors failed! returned ' . var_export ($ret, true)); 
     } 
     $stdout = implode ("\n", $stdout); 
    } 
    unset ($ret); 
    $ret = [ ]; 
    foreach (array_filter (array_map ('trim', explode ("\n\n", trim ($stdout))), 'strlen') as $sensor) { 
     // var_dump($sensor) & die(); 
     $infRaw = array_filter (array_map ('trim', explode ("\n", trim ($sensor))), 'strlen'); 
     if (count ($infRaw) < 2) { 
      throw new \LogicException ('unknown format from sensors, could not understand: ' . $sensor); 
     } 
     $name = $infRaw [0]; 
     unset ($infRaw [0]); 
     $ret [$name] = [ ]; 
     if (0 !== strlen (trim (explode (":", $infRaw [1], 2) [1]))) { 
      // some devices doesn't have a type. seen in 1/5 intel systems tested, and only on 1 device (named `Adapter: Virtual device`, not sure what it was) 
      $ret [$name] ['type'] = $infRaw [1]; 
      unset ($infRaw [1]); 
     } 
     $currentKey = NULL; 
     foreach ($infRaw as $line) { 
      $debugRawLine = $line; 
      if (false !== ($pos = strpos ($line, '_'))) { 
       $line = array_filter (array_map ('trim', explode (":", trim (substr ($line, $pos + 1)))), 'strlen'); 
       if (count ($line) !== 2) { 
        throw new \RuntimeException ('unknown format from sensors, could not understand: ' . $debugRawLine); 
       } 
       $ret [$name] [$currentKey] [$line [0]] = $line [1]; 
      } elseif (substr ($line, - 1) === ':') { 
       $line = substr ($line, 0, - 1); 
       $currentKey = $line; 
      } else { 
       throw new \LogicException ('unknown format from sensors, could not understand: ' . $debugRawLine); 
      } 
     } 
    } 
    return $ret; 
} 

並且已經在5個不同的系統測試成功,包括的Debian 9的ubuntu 16.04,和拱(完全更新2018年1月9日),和它在一個非常老的amd系統(其中sensur輸出格式完全不同)上失敗