我安装了lm-sensors,我想知道是否有某种绑定可以从PHP中访问这些驱动程序?我想要访问各种服务器上的温度读数,并使用pushover通知我的iPhone,如果在几个远程服务器机房中的东西太热了。我还有一些web enabled power switches我的服务器可以访问以在紧急情况下自动关闭设备。我有几个用批处理PHP编写的其他监控系统,所以我宁愿用PHP编写,所以我可以重用现有的代码。而且,这是我最熟悉的语言。我想我可以使用exec来运行传感器并解析输出,但如果其他人已经编写了一个用于访问主板温度读数的PHP类,我想尽可能使用它。
答案 0 :(得分:0)
未尝试和测试但您可以安装类似lm-sensors
的软件包,然后通过exec或类似的东西运行命令sensors
并打印输出
但是肯定有更好的方法可以做到这一点。
修改强>
我原以为你可以记录cpu或者其他任何东西的临时性,只需在php中读取该日志文件并打印输出
答案 1 :(得分:0)
我最后使用的解决方案是使用PHP通过/ sys / class / thermal / thermal_zone2 / temp读取/ sys / class / thermal / thermal_zone0 / temp的内容。这些文件每个都包含一个数字,即千分之一度的温度。这是Linux内核的标准部分,more documentation is available.这似乎是一个标准的内核函数,因此它应该在大多数较新的Linux系统中保持可用。它在我测试的6上可用。
答案 2 :(得分: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和arch(完全更新2018-01-09),它在一个非常古老的amd系统上失败了(感知输出格式完全不同) )