什么时候无限循环在PHP中有用?

什么时候无限循环在PHP中有用?,php,infinite-loop,Php,Infinite Loop,在阅读Paul Hudson的在线PHP教程时,他说 也许令人惊讶的是,无限循环 有时对你的工作很有帮助 脚本。就像无限循环永远不会发生一样 在没有外部影响的情况下终止, 最常用的使用方法是 跳出循环和/或退出循环 完全从循环内部编写脚本 只要条件匹配。你 也可以依靠用户输入 终止循环-例如,如果 您正在编写一个要接受的程序 人们输入数据的时间与 他们想要的,只是不起作用 让脚本循环30000次或更长时间 甚至三亿次。相反 代码应该永远、不断地循环 接受用户输入,直到用户 按Ctrl-C结束程序

在阅读Paul Hudson的在线PHP教程时,他说

也许令人惊讶的是,无限循环 有时对你的工作很有帮助 脚本。就像无限循环永远不会发生一样 在没有外部影响的情况下终止, 最常用的使用方法是 跳出循环和/或退出循环 完全从循环内部编写脚本 只要条件匹配。你 也可以依靠用户输入 终止循环-例如,如果 您正在编写一个要接受的程序 人们输入数据的时间与 他们想要的,只是不起作用 让脚本循环30000次或更长时间 甚至三亿次。相反 代码应该永远、不断地循环 接受用户输入,直到用户 按Ctrl-C结束程序


您能给我一个简单的运行示例,说明如何在PHP中使用无限循环吗?

监控应用程序

如果您有一个后台进程,可以监视服务器的状态,并在出现问题时发送电子邮件。它将有一个无限循环来重复检查服务器(迭代之间会有一些停顿)

服务器侦听客户端

如果您有一个服务器脚本监听套接字连接,它将无限循环,在等待新客户端连接时阻塞

视频游戏

游戏通常有一个“游戏循环”,每帧运行一次,无限期


或者。。。任何其他需要在后台通过定期检查保持运行的内容。

如果您实现了套接字服务器(取自:):

#/usr/local/bin/php–q

我在考虑猜测数字游戏,用户必须猜测随机(或非随机)生成的数字,因此,他必须输入数字,直到得到为止。
这就是您所需要的吗?

当您编写命令行PHP应用程序时,它可能有用吗?因为当PHP脚本由web服务器(Apache或任何其他服务器)运行时,它们的生存期默认限制为30秒(或者您可以在配置文件中手动更改此限制)。

Paul Biggar发布了一篇文章,其中使用无限循环在后台运行,并不断尝试重建LaTeX源

终止脚本的唯一方法是从外部终止它(例如,使用Ctrl+C)

(当然,不是PHP(实际上是Bash),但同样的脚本也可以用PHP来实现。)

对于用户输入

while True:
    input = get_input_from_user("Do you want to continue? ")
    if input not in ("yes", "y", "no", "n"):
        print "invalid input!"
    else: 
        break

有时,与退出条件过长而无法保持可读性的循环不同,不恰当地命名为“无限”循环可能是最好的方法

<?php

while(1) {
  // ... 
  $ok=preg_match_all('/.../',$M,PREG_SET_ORDER);
  if (!$ok) break;

  switch(...) { ... }

  // match another pattern
  $ok=preg_match('/.../',$M,PREG_SET_ORDER);
  if (!$ok) break;

  //and on, and on...
}

我不同意目前为止的其他答案,并建议,如果你对事情很小心,它们永远不会有一席之地

在某些情况下,您总是希望关机,因此至少应该是在while(如果未请求关机,则进行测试)或while(仍然能够有意义地运行)

我认为实际上有时候人们不使用这个条件,而是依赖于像sigint到php这样的东西来终止,但在我看来,这并不是最佳实践,即使它有效

将测试放在循环中并在失败时中断的风险在于,它使代码在将来更容易被修改,从而无意中创建一个无休止的循环。例如,您可能会将while循环的内容包装到另一个循环中,然后突然break语句无法让您脱离while


for(;;)或while(1)应尽可能避免,而且几乎总是可能的。

我认为有一点被忽略了。。。实际上并没有无限循环(您将永远被困在其中),而是
而(true){…}
和co在存在非平凡的退出条件时非常有用(例如,来自第三方库的限制,或需要花费大量时间进行计算但可以在循环内部增量计算的限制,或依赖于用户输入的限制)


在创建命令行应用程序时,不使用
break
的情况下,并非每个循环都可以简明扼要地表示为
for
,而
do
循环都特别有用。然后,应用程序将运行,直到用户告诉它停止。(例如,当用户输入为“退出”时,添加中断/退出语句)


无限循环是您保存在单独工具箱中的工具之一,它不会被打开,因为它是(几乎)最后的工具


我发现它们的最佳用途是使用状态机或接近状态机的循环。这是因为退出条件通常非常复杂,不能放在循环的顶部或底部。

使用无限循环有很多种方法,下面是一个无限循环的示例,可以在1 a之间获得100个随机数nd 200

$numbers = array();
$amount  = 100;

while(1) {
   $number = rand(1, 200);
   if ( !in_array($number, $numbers) ) {
      $numbers[] = $number;
      if ( count($numbers) == $amount ) {
         break;
      }
   }
}

print_r($numbers);

你应该修改这个问题,以更好地反映你想要一个无限循环的PHP示例。我编辑了这个问题,在标题中提到了PHP。你看到过用PHP语言编写的视频游戏吗?@Sergey:当然,为什么不呢?PHP有一些图形库。如果你愿意,你可以用PHP编写一个游戏。我之所以提到它,是因为它是PHP的经典示例无限循环。@Ben S:当然,但是用PHP语言编写一个视频游戏是非常令人头痛的,我想:)我认为PHP不适合实时应用程序。但我曾经读到,如果你想使用它,没有什么可以阻止你!@taabouzeid PHP实际上在CLI环境中非常有能力。它不是适合所有事情的完美工具,但它的功能和适合长时间运行的任务的能力都不亚于Python语言开发者编写一个软件是最舒服的。在python中,这是不可避免的,但循环并不是真的不打算结束的。有时a
do{…}while(
while (true) {
  $input = read_input_from_stdin();

  do_something_with_input();

  if ($input == 'quit') {
    exit(0);
  }
}
$numbers = array();
$amount  = 100;

while(1) {
   $number = rand(1, 200);
   if ( !in_array($number, $numbers) ) {
      $numbers[] = $number;
      if ( count($numbers) == $amount ) {
         break;
      }
   }
}

print_r($numbers);