повторите что-то только один раз в бесконечном цикле на php (Laravel)

#php #laravel

#php #laravel

Вопрос:

У меня есть команда (Laravel). команда выполняет curl для веб-сайта, это своего рода проверка сайта. когда сервер не работает, я хочу что-то повторить, но это должно быть только один раз.

попробовал этот код. не работает. он продолжает повторять. и теперь я застрял.

 class Monitoring extends Command {
     protected $signature = 'run:monitoring';

     private $state;

     public function __construct() {
         parent::__construct();
    
         $this->state = false;
     }

     public function handle() {
         while (true) {
            if (!$this->isMyServerAlive()) {
                $this->state = true;

                if ($this->state) {
                    echo 'THE SERVER IS DOWN!!!';
                }
            } else {
                $this->state = false;
            }
        }
         
     }

     private function isMyServerAlive() {
         return false; // let's say the server is down
     }

}
 

Я знаю, что приведенный выше код будет повторяться.

Цель состоит в том, чтобы, когда isMyServerAlive() функция возвращается к true из false и снова возвращается к true, она будет повторяться только один раз во второй раз, и так далее, и тому подобное.

Я надеюсь, что это сообщение понятно.

Есть ли лучшее решение, чем это?

Комментарии:

1. и при каком условии он начнет фактически повторять или проверять снова? также выполняет эту проверку только один раз в минуту с большим интервалом? если нет, я бы поставил это как задачу

2. isMyServerAlive всегда имеет значение false, поэтому всегда выполняется первый оператор if. Затем вы устанавливаете для состояния значение true, так что ваше следующее утверждение if на самом деле всегда истинно, поэтому оно продолжает повторяться…

3. итак, каково решение? использование базы данных?

4. Я не понимаю, что вы хотите сделать … Код работает так, как написано. но ваши утверждения if оба верны, все время, так что это повторяется каждый раз..

5. Я обновил сообщение. надеюсь, это понятно

Ответ №1:

Вы можете использовать переменную, которую вы переключаете, которая будет определять, следует ли повторять ваше сообщение.

Изначально вы хотели бы true , чтобы, когда ваш сервер становится недоступным, он запускал сообщение. Затем вы устанавливаете его false , чтобы предотвратить повторное запуск сообщения, пока значение не будет возвращено true .

Итак, что-то вроде;

 private $shouldNotify = true;

public function handle() {
    while (true) {
    
        // if the server is unavailable and,
        // a notification has not been trigger for this instance
        if (!$this->isMyServerAlive() amp;amp; $this->shouldNotify) {

            // echo notification 
            echo 'The server is down';

            // set it so that a notification is not triggered on next loop
            $this->shouldNotify = false;
        }

        // if the server is again available
        // set it to trigger a notification when it becomes unavailable again
        if ($this->isMyServerAlive()) {
            $this->shouldNotify = true;
        }
    }
}
 

Вам было бы лучше планировать это как задачу, а не постоянно зацикливаться.

Комментарии:

1. рассмотрите возможность использования статического метода и переменной-члена для повышения производительности.

2. @TylerMiles Это оптимизация, которую следует исследовать, если есть проблемы с производительностью кода. PHP 7 улучшил производительность между статическими и нестатическими функциями до такой степени, что в зависимости от того, что вы делаете, нестатические функции могут быть более производительными. Разные сценарии могут иметь разные результаты, повышение производительности должно основываться на сравнительном анализе вашего кода, а не просто на применении шаблона, потому что кто-то так сказал.

3. В целом, я согласен с вами @Peppermintology; доступ к объектам раньше был быстрее, чем доступ к массиву, до новой реализации хэш-таблицы. Это бесконечный цикл в одном методе, который будет бесконечно оставаться в стеке вызовов. Я уверен в обобщении здесь. Я стараюсь, чтобы мое приложение было полностью функциональным и нецелевым по своей природе. Хотя язык php обязательно изменится снова, и кто знает, кто будет прав «навсегда»…

4. объекты занимают больше памяти Я понимаю, что комментарий звучит так, будто я согласен с Пеппером в скорости объекта. Я этого не делаю. Я согласен только с идеей сравнительного анализа, чтобы быть уверенным. новый хэш php Вы должны прочитать оба из них полностью. К сожалению, в php было много устаревшей информации и методов, которые все еще распространялись по Интернету. Единственный способ really быть в курсе — следить за журналом изменений