当前位置: 首页 > 知识库问答 >
问题:

在php上的无限循环中只回显一次(Laravel)

谢修真
2023-03-14

我有一个(Laravel)命令。该命令是做卷曲到一个网站,这是某种网站检查。当服务器关闭时,我想回声出来的东西,但它应该只有一次。

我试过这个代码。不起作用。它不断回响。现在我被卡住了。

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()函数从false返回true并再次返回true时,它将第二次只回响一次,以此类推。

我希望这个信息是明确的。

还有比这更好的解决办法吗?

共有1个答案

伊铭
2023-03-14

您可以使用一个可以切换的变量来决定是否响应您的消息。

最初,您希望它是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() && $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;
        }
    }
}

您最好将此作为一项任务来安排,而不是不断循环。

 类似资料:
  • 首先,我不是程序员(只是对PHP有一些了解)。我制作了一个带有事件列表的网站,其中有一个选择字段,每月使用Ajax加载过滤事件。 该代码在大约3个月的时间里运行良好。但5天前,它突然停止工作,开始生成一个无限循环。 我调试了代码,发现问题出在“同时”循环上。我试图理解为什么这在一段时间内是完美的,然后它就不会了。(用无限循环崩溃服务器)。 这个函数只给出下个月的第一天。很好用。 这一个,为选择字段

  • 我创建了这个函数来计算我要测量的距离: 由于我不明白的原因,距离的值只返回一次。因此,如果我在forEach函数中抛出2个位置,并且在循环中使用console.log,我会看到所有的计算都是正确的。但如果我返回距离的值,则只返回一个值。 如何正确返回值? 我使用VueJS,其中'Distance toResponder'是一个计算属性来填充表: 因此函数应该返回每个响应者的距离。那么我需要如何调整

  • 我试图实现每秒循环一次的ScheduledExecutorService线程,但现在它只循环一次。 我的问题是如何设置它,使它周期性地循环,而不是一次迭代? 另外,如何将连接池传递给线程,以便每次迭代都可以查询数据库?任何帮助都非常感谢。

  • 我在页面上有一个表,我需要从表中的特定单元格中读取值。我想把这些值写到excel文件中。问题是for loop只循环一次,并且只为Excel中的第一个单元格写入值。我试过很多不同的循环,在谷歌上搜索,但都找不到答案。请帮帮忙。下面是我要编写到Excel的代码: 这是我写入excel文件的地方 循环成功执行并从表中正确打印出值,但我需要将这些值写入Excel。似乎在excel中写入第一个值后,for

  • 问题内容: 请看下面的Java 无限循环。它导致其下面的语句的编译时错误。 以下相同的无限循环可正常工作,并且不会发出任何错误,其中我只是用布尔变量替换了条件。 同样在第二种情况下,循环之后的语句显然不可访问,因为布尔变量为true,但编译器根本没有抱怨。为什么? 编辑:显然,以下版本的卡在无限循环中,但是即使循环中的条件始终存在,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循