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

时间:2009-11-19 19:01:18

标签: php infinite-loop

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

  

也许令人惊讶的是,无限循环   有时可以帮助你   脚本。从来没有无限循环   在没有外界影响的情   最常用的方法是使用它们   突破循环和/或退出   完全来自循环内的脚本   只要条件匹配。您   也可以依靠用户输入   终止循环 - 例如,if   你正在写一个接受的程序   人们只要输入数据就可以了   他们想要,它只是不会工作   让脚本循环30,000次或   甚至300,000,000次。相反,   代码应该永远循环   接受用户输入直到用户   按Ctrl-C结束程序。

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

12 个答案:

答案 0 :(得分:15)

监控应用程序

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

服务器侦听客户端

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

视频游戏

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

或者......需要在后台继续运行并定期检查的任何其他内容。

答案 1 :(得分:5)

如果您实现了套接字服务器(取自:http://devzone.zend.com/article/1086):

    #!/usr/local/bin/php –q

<?php
// Set time limit to indefinite execution
set_time_limit (0);

// Set the ip and port we will listen on
$address = '192.168.0.100';
$port = 9000;
$max_clients = 10;

// Array that will hold client information
$clients = Array();

// Create a TCP Stream socket
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
// Bind the socket to an address/port
socket_bind($sock, $address, $port) or die('Could not bind to address');
// Start listening for connections
socket_listen($sock);

// Loop continuously
while (true) {
    // Setup clients listen socket for reading
    $read[0] = $sock;
    for ($i = 0; $i < $max_clients; $i++)
    {
        if ($client[$i]['sock']  != null)
            $read[$i + 1] = $client[$i]['sock'] ;
    }
    // Set up a blocking call to socket_select()
    $ready = socket_select($read,null,null,null);
    /* if a new connection is being made add it to the client array */
    if (in_array($sock, $read)) {
        for ($i = 0; $i < $max_clients; $i++)
        {
            if ($client[$i]['sock'] == null) {
                $client[$i]['sock'] = socket_accept($sock);
                break;
            }
            elseif ($i == $max_clients - 1)
                print ("too many clients")
        }
        if (--$ready <= 0)
            continue;
    } // end if in_array

    // If a client is trying to write - handle it now
    for ($i = 0; $i < $max_clients; $i++) // for each client
    {
        if (in_array($client[$i]['sock'] , $read))
        {
            $input = socket_read($client[$i]['sock'] , 1024);
            if ($input == null) {
                // Zero length string meaning disconnected
                unset($client[$i]);
            }
            $n = trim($input);
            if ($input == 'exit') {
                // requested disconnect
                socket_close($client[$i]['sock']);
            } elseif ($input) {
                // strip white spaces and write back to user
                $output = ereg_replace("[ \t\n\r]","",$input).chr(0);
                socket_write($client[$i]['sock'],$output);
            }
        } else {
            // Close the socket
            socket_close($client[$i]['sock']);
            unset($client[$i]);
        }
    }
} // end while
// Close the master sockets
socket_close($sock);
?> 

答案 2 :(得分:3)

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

答案 3 :(得分:2)

到目前为止,我不同意其他答案,并建议,如果你对事情保持谨慎,他们就没有地方。

总有一些情况需要关闭,所以至少应该是(测试,如果没有请求关闭)或者(仍然能够有意义的话)运行

我认为实际上有些时候人们不会使用这些条件并依赖于像sigint这样的东西来终止,但在我看来这不是最好的做法,即使它有效。

将测试置于循环中并在失败时破坏的风险在于,它可以使代码在将来更容易被修改,从而无意中创建无限循环。例如,你可以将while循环的内容包装在另一个循环中,然后突然间break语句不会让你离开...

应尽可能避免使用<;>(;;)或while(1),并且几乎总是可以。

答案 4 :(得分:2)

有很多方法可以使用无限循环,这里有一个无限循环的例子来获得1到200之间的100个随机数

$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);

答案 5 :(得分:1)

无限循环在创建命令行应用程序时特别有用。然后应用程序将运行,直到用户告诉它停止。 (例如,当用户输入为“quit”时添加break / exit语句)

while (true) {
  $input = read_input_from_stdin();

  do_something_with_input();

  if ($input == 'quit') {
    exit(0);
  }
}

答案 6 :(得分:0)

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

答案 7 :(得分:0)

Paul Biggar发布了一个make script for LaTeX projects,它使用无限循环在后台运行,并不断尝试重建LaTeX源。

终止脚本的唯一方法是在外部杀死它(例如使用 Ctrl + C )。

(当然,不是PHP(实际上是Bash),但是相同的脚本很可能在PHP中实现。)

答案 8 :(得分:0)

对于用户输入......

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

答案 9 :(得分:0)

有时而不是一个退出条件太长而不能保持可读性的循环,不正确命名的“无限”循环可能是最好的方法。

<?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...
}

答案 10 :(得分:0)

我认为有一点是被遗漏的......没有真正的无限循环(你会被永远地困在它们中),而while(true){...}和co在你有非平凡的退出条件时很有用(例如那些来自第三方库,或者需要花费大量时间来计算的限制,但可以在循环内逐步计算出来,或依赖用户输入的东西。)

在不使用for的情况下,并非每个循环都可以简洁地声明为whiledobreak循环,这一点不足为奇。

答案 11 :(得分:0)

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

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