133 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			133 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|  | <?php | ||
|  | 
 | ||
|  | namespace NoccyLabs\Linux\Cpu; | ||
|  | 
 | ||
|  | class Cpu | ||
|  | { | ||
|  |     /** | ||
|  |      * @var string The path to the sys control files | ||
|  |      */ | ||
|  |     protected $sys_path = "/sys/devices/system/cpu"; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @var int The number of CPUs in this system | ||
|  |      */ | ||
|  |     protected $num_cpus; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @var int[] The available scaling frequencies | ||
|  |      */ | ||
|  |     protected $available_frequencies; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @var string[] The available governors | ||
|  |      */ | ||
|  |     protected $available_governors; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * | ||
|  |      */ | ||
|  |     public function __construct($path=null) | ||
|  |     { | ||
|  |         if ($path) { | ||
|  |             $this->sys_path = $path; | ||
|  |         } | ||
|  |         $this->readSysInfo(); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Read and cache information from sysfs | ||
|  |      * | ||
|  |      */ | ||
|  |     protected function readSysInfo() | ||
|  |     { | ||
|  |         // Get number of CPU cores
 | ||
|  |         $cpus = glob($this->sys_path . "/cpu?"); | ||
|  |         $this->num_cpus = count($cpus); | ||
|  | 	 | ||
|  | 	    // Get the available CPU frequencies
 | ||
|  | 	    $freq_raw = file_get_contents($this->sys_path."/cpu0/cpufreq/scaling_available_frequencies"); | ||
|  | 	    $freq_list = explode(" ", trim($freq_raw)); | ||
|  | 	    sort($freq_list); | ||
|  | 	    $this->available_frequencies = array_map("intval", $freq_list); | ||
|  | 
 | ||
|  |         // Get the available CPU governor
 | ||
|  | 	    $govr_raw = file_get_contents($this->sys_path."/cpu0/cpufreq/scaling_available_governors"); | ||
|  | 	    $govr_list = explode(" ", trim($govr_raw)); | ||
|  | 	    sort($govr_list); | ||
|  | 	    $this->available_governors = $govr_list; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Get the number of CPU cores in the system. The operations by the CPU | ||
|  |      * class will operate on all cores. | ||
|  |      * | ||
|  |      * @return int The number of CPU cores | ||
|  |      */     | ||
|  |     public function getNumCpus() | ||
|  |     { | ||
|  |         return $this->num_cpus; | ||
|  |     } | ||
|  |      | ||
|  |     /** | ||
|  |      * Get the available CPU frequencies in hertz for scaling. | ||
|  |      * | ||
|  |      * @return int[] The available CPU frequencies | ||
|  |      */ | ||
|  |     public function getAvailableFrequencies() | ||
|  |     { | ||
|  |         return $this->available_frequencies; | ||
|  |     } | ||
|  |      | ||
|  |     /** | ||
|  |      * Get the current scaling frequency of the CPU in hertz. | ||
|  |      * | ||
|  |      * @return int The CPU frequency in Hz | ||
|  |      */ | ||
|  |     public function getCurrentFrequency() | ||
|  |     { | ||
|  |         $freq_curr = file_get_contents($this->sys_path."/cpu0/cpufreq/scaling_cur_freq"); | ||
|  |         return (int)$freq_curr; | ||
|  |     } | ||
|  |      | ||
|  |     public function setCurrentFrequency($freq) | ||
|  |     { | ||
|  |         if (!in_array((int)$freq, $this->available_frequencies)) { | ||
|  |             $avail = join(", ", $this->available_frequencies); | ||
|  |             throw new \InvalidArgumentException("CPU frequency {$freq} not supported (available: {$avail}"); | ||
|  |         } | ||
|  |         file_put_contents($this->sys_path."/cpu0/cpufreq/scaling_cur_freq", (int)$freq); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Get a list of the available governors | ||
|  |      * | ||
|  |      * @return string[] The available governors | ||
|  |      */     | ||
|  |     public function getAvailableGovernors() | ||
|  |     { | ||
|  |         return $this->available_governors; | ||
|  |     } | ||
|  |      | ||
|  |     /** | ||
|  |      * Get the currently active governor | ||
|  |      * | ||
|  |      * @return string The name of the currently active governor | ||
|  |      */ | ||
|  |     public function getCurrentGovernor() | ||
|  |     { | ||
|  |         $govr_curr = file_get_contents($this->sys_path."/cpu0/cpufreq/scaling_governor"); | ||
|  |         return trim($govr_curr); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function setCurrentGovernor($governor) | ||
|  |     { | ||
|  |         if (!in_array((int)$governor, $this->available_governors)) { | ||
|  |             $avail = join(", ", $this->available_governors); | ||
|  |             throw new \InvalidArgumentException("Governor {$governor} not supported (available: {$avail}"); | ||
|  |         } | ||
|  |         file_put_contents($this->sys_path."/cpu0/cpufreq/scaling_governor", $governor); | ||
|  |     } | ||
|  |      | ||
|  | } |