PHP переменная класса установить / получить проблему - PullRequest
2 голосов
/ 30 января 2010

Я попытался написать класс 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';
        }
    }
}
?>

Ответы [ 2 ]

1 голос
/ 30 января 2010
<?
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 (). Я предполагаю, что вы захотите добавить параметр времени к 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)); 
1 голос
/ 30 января 2010

Ваш код работает нормально, хотя дизайн делает его использование менее интуитивным, чем могло бы быть. Я поместил определение вашего класса в файл, добавил следующие строки внизу, и он выдает «ok» при запуске.

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

Странная вещь в дизайне вашего класса, для меня, заключается в том, что он не разрешает «загрузку» при инициализации, а только вызывает load автоматически, когда вы пытаетесь напечатать объект loadavg. Если вы хотите иметь возможность доступа к status_name () без предварительного явного вызова load (), вы можете просто вызвать load в __construct (возможно, с разумным значением по умолчанию, которое можно переопределить, как делителем ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...