我试图编写一个PHP类来获取Linux机器的正常运行时间。 将正确获取正常运行时间,但我有一个if
语句,用于确定负载平均值是否为“高”并设置警告代码,并且似乎没有工作(它保持在0)。
我已经从课程中包含了所有代码(大约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 :(得分:1)
您的代码似乎工作正常,但设计使其使用不那么直观。我将您的类定义放在一个文件中,在底部添加以下行,并在运行时打印“ok”。
$load = new loadavg ();
$load->load (5);
echo $load->status_name () . "\n";
对我来说,类的设计很奇怪,它在初始化时不允许“加载”,但是当你尝试打印loadavg对象时,只会自动调用load。如果你希望能够在没有先显式调用load()的情况下访问status_name(),你可以在__construct中调用load(可能有一个合理的默认值,可以像被除数一样被覆盖...)
答案 1 :(得分: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
这不是预期的吗?如果我取出print($ la)语句,则输出为:
error
这是因为永远不会调用load()函数来设置状态。如果要正确打印状态,则必须先运行load()。我假设您要将time参数添加到status_name并在返回之前调用load,如下所示:
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));