如何在Debian上用PHP获取主板温度读数?

时间:2014-01-28 21:45:05

标签: php

我安装了lm-sensors,我想知道是否有某种绑定可以从PHP中访问这些驱动程序?我想要访问各种服务器上的温度读数,并使用pushover通知我的iPhone,如果在几个远程服务器机房中的东西太热了。我还有一些web enabled power switches我的服务器可以访问以在紧急情况下自动关闭设备。我有几个用批处理PHP编写的其他监控系统,所以我宁愿用PHP编写,所以我可以重用现有的代码。而且,这是我最熟悉的语言。我想我可以使用exec来运行传感器并解析输出,但如果其他人已经编写了一个用于访问主板温度读数的PHP类,我想尽可能使用它。

3 个答案:

答案 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系统上失败了(感知输出格式完全不同) )