public static function read_sensor() { // Determine the current processor frequency $cpu_core = 0; // TODO: for now just monitoring the first core $info = 0; if (phodevi::is_linux()) { // First, the ideal way, with modern CPUs using CnQ or EIST and cpuinfo reporting the current if (is_file('/sys/devices/system/cpu/cpu' . $cpu_core . '/cpufreq/scaling_cur_freq')) { $info = pts_file_io::file_get_contents('/sys/devices/system/cpu/cpu' . $cpu_core . '/cpufreq/scaling_cur_freq'); $info = intval($info) / 1000; } else { if (is_file('/proc/cpuinfo')) { $cpu_speeds = phodevi_linux_parser::read_cpuinfo('cpu MHz'); if (isset($cpu_speeds[0])) { $cpu_core = isset($cpu_speeds[$cpu_core]) ? $cpu_core : 0; $info = intval($cpu_speeds[$cpu_core]); } } } } else { if (phodevi::is_solaris()) { $info = shell_exec('psrinfo -v | grep MHz'); $info = substr($info, strrpos($info, 'at') + 3); $info = trim(substr($info, 0, strpos($info, 'MHz'))); } else { if (phodevi::is_bsd()) { $info = phodevi_bsd_parser::read_sysctl('dev.cpu.0.freq'); } else { if (phodevi::is_macosx()) { $info = phodevi_osx_parser::read_osx_system_profiler('SPHardwareDataType', 'ProcessorSpeed'); if (($cut_point = strpos($info, ' ')) > 0) { $info = substr($info, 0, $cut_point); $info = str_replace(',', '.', $info); } if ($info < 100) { $info *= 1000; } } } } } return pts_math::set_precision($info, 2); }
public static function cpu_model() { // Returns the processor name / frequency information $info = null; if (isset(phodevi::$vfs->cpuinfo)) { $physical_cpu_ids = phodevi_linux_parser::read_cpuinfo('physical id'); $physical_cpu_count = count(array_unique($physical_cpu_ids)); $cpu_strings = phodevi_linux_parser::read_cpuinfo(array('model name', 'Processor', 'cpu', 'cpu model')); $cpu_strings_unique = array_unique($cpu_strings); if ($physical_cpu_count == 1 || empty($physical_cpu_count)) { // Just one processor if (isset($cpu_strings[0]) && ($cut = strpos($cpu_strings[0], ' (')) !== false) { $cpu_strings[0] = substr($cpu_strings[0], 0, $cut); } $info = isset($cpu_strings[0]) ? $cpu_strings[0] : null; if (strpos($info, 'ARM') !== false) { if (is_dir('/sys/devices/system/exynos-core/') && stripos($info, 'Exynos') === false) { $info = 'Exynos ' . $info; } } } else { if ($physical_cpu_count > 1 && count($cpu_strings_unique) == 1) { // Multiple processors, same model $info = $physical_cpu_count . ' x ' . $cpu_strings[0]; } else { if ($physical_cpu_count > 1 && count($cpu_strings_unique) > 1) { // Multiple processors, different models $current_id = -1; $current_string = $cpu_strings[0]; $current_count = 0; $cpus = array(); for ($i = 0; $i < count($physical_cpu_ids); $i++) { if ($current_string != $cpu_strings[$i] || $i == count($physical_cpu_ids) - 1) { array_push($cpus, $current_count . ' x ' . $current_string); $current_string = $cpu_strings[$i]; $current_count = 0; } if ($physical_cpu_ids[$i] != $current_id) { $current_count++; $current_id = $physical_cpu_ids[$i]; } } $info = implode(', ', $cpus); } } } } else { if (phodevi::is_solaris()) { $dmi_cpu = phodevi_solaris_parser::read_sun_ddu_dmi_info('CPUType', '-C'); if (count($dmi_cpu) == 0) { $dmi_cpu = phodevi_solaris_parser::read_sun_ddu_dmi_info('ProcessorName'); } if (count($dmi_cpu) > 0) { $info = $dmi_cpu[0]; } else { $info = trim(shell_exec('dmesg 2>&1 | grep cpu0')); $info = trim(substr($info, strrpos($info, 'cpu0:') + 6)); if (empty($info)) { $info = array_pop(phodevi_solaris_parser::read_sun_ddu_dmi_info('ProcessorManufacturer')); } } //TODO: Add in proper support for reading multiple CPUs, similar to the code from above $physical_cpu_count = count(phodevi_solaris_parser::read_sun_ddu_dmi_info('ProcessorSocketType')); if ($physical_cpu_count > 1 && !empty($info)) { // TODO: For now assuming when multiple CPUs are installed, that they are of the same type $info = $physical_cpu_count . ' x ' . $info; } } else { if (phodevi::is_bsd()) { $info = phodevi_bsd_parser::read_sysctl('hw.model'); } else { if (phodevi::is_macosx()) { $info = phodevi_osx_parser::read_osx_system_profiler('SPHardwareDataType', 'ProcessorName'); } else { if (phodevi::is_windows()) { $info = phodevi_windows_parser::read_cpuz('Processor 1', 'Name'); if (!$info) { $info = getenv('PROCESSOR_IDENTIFIER'); } } } } } } if (empty($info)) { $info = 'Unknown'; } else { if (($strip_point = strpos($info, '@')) > 0) { $info = trim(substr($info, 0, $strip_point)); // stripping out the reported freq, since the CPU could be overclocked, etc } $info = pts_strings::strip_string($info); // It seems Intel doesn't report its name when reporting Pentium hardware if (strpos($info, 'Pentium') !== false && strpos($info, 'Intel') === false) { $info = 'Intel ' . $info; } if (substr($info, 0, 5) == 'Intel') { $cpu_words = explode(' ', $info); $cpu_words_count = count($cpu_words); // Convert strings like 'Intel Core i7 M 620' -> 'Intel Core i7 620M' and 'Intel Core i7 X 990' -> 'Intel Core i7 990X' to better reflect Intel product marketing names if ($cpu_words_count > 4 && is_numeric($cpu_words[$cpu_words_count - 1]) && strlen($cpu_words[$cpu_words_count - 2]) == 1 && strlen($cpu_words[$cpu_words_count - 3]) == 2) { $cpu_words[$cpu_words_count - 1] .= $cpu_words[$cpu_words_count - 2]; unset($cpu_words[$cpu_words_count - 2]); $info = implode(' ', $cpu_words); } } } return $info; }
public static function motherboard_string() { // Returns the motherboard / system model name or number $info = null; if (phodevi::is_macosx()) { $info = phodevi_osx_parser::read_osx_system_profiler('SPHardwareDataType', 'ModelName'); } else { if (phodevi::is_solaris()) { $manufacturer = phodevi_solaris_parser::read_sun_ddu_dmi_info(array('MotherBoardInformation,Manufacturer', 'SystemInformation,Manufacturer')); $product = phodevi_solaris_parser::read_sun_ddu_dmi_info(array('MotherBoardInformation,Product', 'SystemInformation,Product', 'SystemInformation,Model')); if (count($manufacturer) == 1 && count($product) == 1) { $info = $manufacturer[0] . ' ' . $product[0]; } } else { if (phodevi::is_bsd()) { $vendor = phodevi_bsd_parser::read_kenv('smbios.system.maker'); $product = phodevi_bsd_parser::read_kenv('smbios.system.product'); $version = phodevi_bsd_parser::read_kenv('smbios.system.version'); // for at least Lenovo ThinkPads this is where it displays ThinkPad model if ($vendor != null && ($product != null || $version != null)) { $info = $vendor . ' ' . $product . ' ' . $version; } else { if (($vendor = phodevi_bsd_parser::read_sysctl('hw.vendor')) != false && ($version = phodevi_bsd_parser::read_sysctl(array('hw.version', 'hw.product'))) != false) { $info = trim($vendor . ' ' . $version); } else { if (($acpi = phodevi_bsd_parser::read_sysctl('dev.acpi.0.%desc')) != false) { $info = trim($acpi); } } } } else { if (phodevi::is_linux()) { $vendor = phodevi_linux_parser::read_sys_dmi(array('board_vendor', 'sys_vendor')); $name = phodevi_linux_parser::read_sys_dmi(array('board_name', 'product_name')); $version = phodevi_linux_parser::read_sys_dmi(array('board_version', 'product_version')); if ($vendor != false && $name != false) { $info = strpos($name . ' ', $vendor . ' ') === false ? $vendor . ' ' : null; $info .= $name; if ($version != false && strpos($info, $version) === false && pts_strings::string_only_contains($version, pts_strings::CHAR_NUMERIC | pts_strings::CHAR_DECIMAL)) { $info .= (substr($version, 0, 1) == 'v' ? ' ' : ' v') . $version; } } if (empty($info)) { if ($info == null) { $hw_string = phodevi_linux_parser::read_cpuinfo('Hardware'); if (count($hw_string) == 1) { $info = $hw_string[0]; } } $bios_vendor = phodevi_linux_parser::read_sys_dmi('bios_vendor'); $bios_version = phodevi_linux_parser::read_sys_dmi('bios_version'); if ($bios_vendor != null) { $info = $bios_vendor . ' ' . $bios_version; } if ($info == null) { $hw_string = phodevi_linux_parser::read_cpuinfo('machine'); if (count($hw_string) == 1) { $info = $hw_string[0]; } } } if (empty($info)) { $info = phodevi_linux_parser::read_sys_dmi('product_name'); } if (empty($info) && is_file('/sys/bus/soc/devices/soc0/machine')) { $info = pts_file_io::file_get_contents('/sys/bus/soc/devices/soc0/machine'); } if (empty($info)) { // Works on the MIPS Creator CI20 $hardware = phodevi_linux_parser::read_cpuinfo('Hardware'); if (!empty($hardware)) { $info = array_pop($hardware); } } } else { if (phodevi::is_windows()) { $info = phodevi_windows_parser::read_cpuz('Mainboard Model', null); } } } } } if ((strpos($info, 'Mac ') !== false || strpos($info, 'MacBook') !== false) && strpos($info, 'Apple') === false) { $info = 'Apple ' . $info; } // ensure words aren't repeated (e.g. VMware VMware Virtual and MSI MSI X58M (MS-7593)) $info = implode(' ', array_unique(explode(' ', $info))); return $info; }
private function cpu_freq_linux() { $frequency = -1; // First, the ideal way, with modern CPUs using CnQ or EIST and cpuinfo reporting the current frequency. if (is_file('/sys/devices/system/cpu/' . $this->cpu_to_monitor . '/cpufreq/scaling_cur_freq')) { $frequency = pts_file_io::file_get_contents('/sys/devices/system/cpu/' . $this->cpu_to_monitor . '/cpufreq/scaling_cur_freq'); $frequency = intval($frequency) / 1000; } else { if (is_file('/proc/cpuinfo')) { $cpu_speeds = phodevi_linux_parser::read_cpuinfo('cpu MHz'); $cpu_number = intval(substr($this->cpu_to_monitor, 3)); //cut 'cpu' from the beginning if (!isset($cpu_speeds[$cpu_number])) { return -1; } $frequency = intval($cpu_speeds[$cpu_number]); } } return $frequency; }