Linux::_cpuinfo PHP Method

_cpuinfo() protected method

CPU information All of the tags here are highly architecture dependant.
protected _cpuinfo ( ) : void
return void
    protected function _cpuinfo()
    {
        if (CommonFunctions::rfts('/proc/cpuinfo', $bufr)) {
            $processors = preg_split('/\\s?\\n\\s?\\n/', trim($bufr));
            //first stage
            $_arch = null;
            $_impl = null;
            $_part = null;
            $_hard = null;
            $_revi = null;
            $_cpus = null;
            $_buss = null;
            foreach ($processors as $processor) {
                if (!preg_match('/^\\s*processor\\s*:/mi', $processor)) {
                    $details = preg_split("/\n/", $processor, -1, PREG_SPLIT_NO_EMPTY);
                    foreach ($details as $detail) {
                        $arrBuff = preg_split('/\\s*:\\s*/', trim($detail));
                        if (count($arrBuff) == 2 && ($arrBuff1 = trim($arrBuff[1])) !== '') {
                            switch (strtolower($arrBuff[0])) {
                                case 'cpu architecture':
                                    $_arch = $arrBuff1;
                                    break;
                                case 'cpu implementer':
                                    $_impl = $arrBuff1;
                                    break;
                                case 'cpu part':
                                    $_part = $arrBuff1;
                                    break;
                                case 'hardware':
                                    $_hard = $arrBuff1;
                                    break;
                                case 'revision':
                                    $_revi = $arrBuff1;
                                    break;
                                case 'cpu frequency':
                                    if (preg_match('/^(\\d+)\\s+Hz/i', $arrBuff1, $bufr2)) {
                                        $_cpus = round($bufr2[1] / 1000000);
                                    }
                                    break;
                                case 'system bus frequency':
                                    if (preg_match('/^(\\d+)\\s+Hz/i', $arrBuff1, $bufr2)) {
                                        $_buss = round($bufr2[1] / 1000000);
                                    }
                                    break;
                            }
                        }
                    }
                }
            }
            //second stage
            $procname = null;
            foreach ($processors as $processor) {
                if (preg_match('/^\\s*processor\\s*:/mi', $processor)) {
                    $proc = null;
                    $arch = null;
                    $impl = null;
                    $part = null;
                    $dev = new CpuDevice();
                    $details = preg_split("/\n/", $processor, -1, PREG_SPLIT_NO_EMPTY);
                    foreach ($details as $detail) {
                        $arrBuff = preg_split('/\\s*:\\s*/', trim($detail));
                        if (count($arrBuff) == 2 && ($arrBuff1 = trim($arrBuff[1])) !== '') {
                            switch (strtolower($arrBuff[0])) {
                                case 'processor':
                                    $proc = $arrBuff1;
                                    if (is_numeric($proc)) {
                                        if (strlen($procname) > 0) {
                                            $dev->setModel($procname);
                                        }
                                    } else {
                                        $procname = $proc;
                                        $dev->setModel($procname);
                                    }
                                    break;
                                case 'model name':
                                case 'cpu model':
                                case 'cpu type':
                                case 'cpu':
                                    $dev->setModel($arrBuff1);
                                    break;
                                case 'cpu mhz':
                                case 'clock':
                                    if ($arrBuff1 > 0) {
                                        //openSUSE fix
                                        $dev->setCpuSpeed($arrBuff1);
                                    }
                                    break;
                                case 'cycle frequency [hz]':
                                    $dev->setCpuSpeed($arrBuff1 / 1000000);
                                    break;
                                case 'cpu0clktck':
                                    $dev->setCpuSpeed(hexdec($arrBuff1) / 1000000);
                                    // Linux sparc64
                                    break;
                                case 'l2 cache':
                                case 'cache size':
                                    $dev->setCache(preg_replace("/[a-zA-Z]/", "", $arrBuff1) * 1024);
                                    break;
                                case 'initial bogomips':
                                case 'bogomips':
                                case 'cpu0bogo':
                                    $dev->setBogomips(round($arrBuff1));
                                    break;
                                case 'flags':
                                    if (preg_match("/ vmx/", $arrBuff1)) {
                                        $dev->setVirt("vmx");
                                    } elseif (preg_match("/ svm/", $arrBuff1)) {
                                        $dev->setVirt("svm");
                                    } elseif (preg_match("/ hypervisor/", $arrBuff1)) {
                                        $dev->setVirt("hypervisor");
                                    }
                                    break;
                                case 'i size':
                                case 'd size':
                                    if ($dev->getCache() === null) {
                                        $dev->setCache($arrBuff1 * 1024);
                                    } else {
                                        $dev->setCache($dev->getCache() + $arrBuff1 * 1024);
                                    }
                                    break;
                                case 'cpu architecture':
                                    $arch = $arrBuff1;
                                    break;
                                case 'cpu implementer':
                                    $impl = $arrBuff1;
                                    break;
                                case 'cpu part':
                                    $part = $arrBuff1;
                                    break;
                            }
                        }
                    }
                    if ($arch === null) {
                        $arch = $_arch;
                    }
                    if ($impl === null) {
                        $impl = $_impl;
                    }
                    if ($part === null) {
                        $part = $_part;
                    }
                    // sparc64 specific code follows
                    // This adds the ability to display the cache that a CPU has
                    // Originally made by Sven Blumenstein <[email protected]> in 2004
                    // Modified by Tom Weustink <[email protected]> in 2004
                    $sparclist = array('SUNW,UltraSPARC@0,0', 'SUNW,UltraSPARC-II@0,0', 'SUNW,UltraSPARC@1c,0', 'SUNW,UltraSPARC-IIi@1c,0', 'SUNW,UltraSPARC-II@1c,0', 'SUNW,UltraSPARC-IIe@0,0');
                    foreach ($sparclist as $name) {
                        if (CommonFunctions::rfts('/proc/openprom/' . $name . '/ecache-size', $buf, 1, 32, false)) {
                            $dev->setCache(base_convert($buf, 16, 10));
                        }
                    }
                    // sparc64 specific code ends
                    // XScale detection code
                    if ($arch === "5TE" && $dev->getBogomips() != null) {
                        $dev->setCpuSpeed($dev->getBogomips());
                        //BogoMIPS are not BogoMIPS on this CPU, it's the speed
                        $dev->setBogomips(null);
                        // no BogoMIPS available, unset previously set BogoMIPS
                    }
                    if ($dev->getBusSpeed() == 0 && $_buss !== null) {
                        $dev->setBusSpeed($_buss);
                    }
                    if ($dev->getCpuSpeed() == 0 && $_cpus !== null) {
                        $dev->setCpuSpeed($_cpus);
                    }
                    if ($proc != null) {
                        if (!is_numeric($proc)) {
                            $proc = 0;
                        }
                        // variable speed processors specific code follows
                        if (CommonFunctions::rfts('/sys/devices/system/cpu/cpu' . $proc . '/cpufreq/cpuinfo_cur_freq', $buf, 1, 4096, false)) {
                            $dev->setCpuSpeed($buf / 1000);
                        } elseif (CommonFunctions::rfts('/sys/devices/system/cpu/cpu' . $proc . '/cpufreq/scaling_cur_freq', $buf, 1, 4096, false)) {
                            $dev->setCpuSpeed($buf / 1000);
                        }
                        if (CommonFunctions::rfts('/sys/devices/system/cpu/cpu' . $proc . '/cpufreq/cpuinfo_max_freq', $buf, 1, 4096, false)) {
                            $dev->setCpuSpeedMax($buf / 1000);
                        }
                        if (CommonFunctions::rfts('/sys/devices/system/cpu/cpu' . $proc . '/cpufreq/cpuinfo_min_freq', $buf, 1, 4096, false)) {
                            $dev->setCpuSpeedMin($buf / 1000);
                        }
                        // variable speed processors specific code ends
                        if (PSI_LOAD_BAR) {
                            $dev->setLoad($this->_parseProcStat('cpu' . $proc));
                        }
                        if (CommonFunctions::rfts('/proc/acpi/thermal_zone/THRM/temperature', $buf, 1, 4096, false)) {
                            $dev->setTemp(substr($buf, 25, 2));
                        }
                        // Raspbery detection
                        if ($arch === '7' && $impl === '0x41' && ($_hard === 'BCM2708' || $_hard === 'BCM2709' || $_hard === 'BCM2710') && $_revi !== null) {
                            if (($cputype = $this->setRaspberry($_revi, $part)) !== "") {
                                if (($cpumodel = $dev->getModel()) !== "") {
                                    $dev->setModel($cpumodel . ' - ' . $cputype);
                                } else {
                                    $dev->setModel($cputype);
                                }
                            }
                        } else {
                            // other hardware
                            if ($_hard !== null && $this->sys->getMachine() === "") {
                                $this->sys->setMachine($_hard);
                            }
                        }
                        if ($dev->getModel() === "") {
                            $dev->setModel("unknown");
                        }
                        $this->sys->setCpus($dev);
                    }
                }
            }
        }
    }