2010-01-30 49 views
2

我試圖寫一個PHP類,得到我的Linux機器的正常運行時間。它得到正確的運行時間,但我有一個if聲明,確定平均負載是否爲「高」與否並設置警告代碼,它似乎並沒有工作(它停留在0) 。PHP類變量設置/獲取問題

我已經包括了所有在這裏的代碼從類(50行左右),因爲我不知道我會採取什麼樣的了,但還是提供了這是怎麼回事錯在這裏的一些信息。

<?php 
class loadavg { 

    private $divisor, $status; 

    public function __construct($set_divisor = 1){ 
     $this->divisor = $set_divisor; 
    } 

    public function __toString(){ 
     return $this->load(1).', '.$this->load(5).', '.$this->load(15)."\n"; 
    } 

    public function load($time = 1){ 
     $loadfile = shell_exec('cat /proc/loadavg'); 
     $split = preg_split('/ /', $loadfile); 

     if ($split[1] > (2 * $this->divisor)){ 
      $this->status = 3; 
     } else if ($split[1] > $this->divisor){ 
      $this->status = 2; 
     } else { 
      $this->status = 1; 
     } 

     switch($time){ 
      case 1: 
       return $split[0]; 
      case 5: 
       return $split[1]; 
      case 15: 
      return $split[2]; 
     } 
    } 

    public function status_name(){ 
     switch ($this->status){ 
      case 3: 
       return 'critical'; 
      case 2: 
       return 'warn'; 
      case 1: 
       return 'ok'; 
      case 0: 
       return 'error'; 
     } 
    } 
} 
?> 
+0

發佈的輸出' print_r($ split)' – Pentium10 2010-01-30 20:53:29

+0

你在調用status_name之前調用load嗎? – Pentium10 2010-01-30 20:55:30

回答

1
<? 
class loadavg { 

    private $divisor, $status; 

    public function __construct($set_divisor = 1){ 
     $this->divisor = $set_divisor; 
    } 

    public function __toString(){ 
     return $this->load(1).', '.$this->load(5).', '.$this->load(15)."\n"; 
    } 

    public function load($time = 1){ 
     //$loadfile = shell_exec('cat /proc/loadavg'); 
     $loadfile = '1.5 1.5 1.5'; 
     $split = preg_split('/ /', $loadfile); 

     if ($split[1] > (2 * $this->divisor)){ 
      $this->status = 3; 
     } else if ($split[1] > $this->divisor){ 
      $this->status = 2; 
     } else { 
      $this->status = 1; 
     } 

     switch($time){ 
      case 1: 
       return $split[0]; 
      case 5: 
       return $split[1]; 
      case 15: 
      return $split[2]; 
     } 
    } 

    public function status_name(){ 
     switch ($this->status){ 
      case 3: 
       return 'critical'; 
      case 2: 
       return 'warn'; 
      case 1: 
       return 'ok'; 
      case 0: 
       return 'error'; 
     } 
    } 
} 

$la = new loadavg(); 
print($la); 
print($la->status_name()); 

我只是執行這一點,並得到了輸出:

1.5, 1.5, 1.5 
warn 

這不是什麼預期?如果我拿出打印($ LA)聲明,輸出是這樣的:

error 

這是因爲load()函數沒有被調用設置狀態。如果您想要正確打印狀態,則必須先運行load()。我假設你要添加的時間參數status_name並在返回之前調用負載,就像這樣:

public function status_name($time =1){ 
    $this->load($time); 
    switch ($this->status){ 
     case 3: 
      return 'critical'; 
     case 2: 
      return 'warn'; 
     case 1: 
      return 'ok'; 
     case 0: 
      return 'error'; 
    } 
} 

現在將使你能夠做到這一點:

$la = new loadavg(); 
print($la->status_name(5)); 
+0

我看到,load()需要在status_name()內運行才能工作。謝謝。 – ZeroUptime 2010-01-30 21:23:38

1

您的代碼似乎做工精細,雖然設計使得它的使用不太直觀,它可能是。我把你的類定義放在一個文件中,在底部添加下面幾行,並在運行時打印出'ok'。

$load = new loadavg(); 
$load->load (5); 
echo $load->status_name() . "\n"; 

你的類的設計的奇怪的事情,對我來說,它不會允許「裝」在初始化,但是當你嘗試打印loadavg對象只自動調用負載。如果您希望能夠訪問status_name()而不明確調用load(),你可以調用__construct負載(或許還有一個合理的默認是不能修改的,就像除數...)