When are infinite loops are useful in PHP?

后端 未结 12 902
日久生厌
日久生厌 2020-12-09 21:17

While reading through the great online PHP tutorials of Paul Hudson he said

Perhaps surprisingly, infinite loops can sometimes be h

相关标签:
12条回答
  • 2020-12-09 21:42

    I'm thinking about the guess-the-number game, where the user has to guess the randomly (or not) generated number, so, he'll have to enter numbers until he gets it. Is that what you needed ?

    0 讨论(0)
  • 2020-12-09 21:48

    Maybe it useful when you write a command line PHP application? Because when PHP-scripts runs by web-server (Apache or any other) they lifetime is limited by 30 seconds by default (or you can manually change this limit at the configuration file).

    0 讨论(0)
  • 2020-12-09 21:49

    I think a point is being missed... there aren't really infinite loops (you would be stuck in them forever), rather while(true){...} and co are useful when you have non trivial exit conditions (e.g. those coming from a third-party library, or a limit which would take a lot of time to calculate but can be worked out incrementally inside of the loop, or something relying on user input).

    It shouldn't be surprising that not every loop can be concisely stated as a for, while or do loop without using break.

    0 讨论(0)
  • 2020-12-09 21:50

    Monitoring applications

    If you have a background process that monitors the state of your servers and sends an email if trouble occurs. It would have an infinite loop to repeatably check the servers (with some pause between iterations.)

    Server listening for Clients

    If you have a server script that listens to a socket for connections, it will loop infinitely, blocking while waiting for new clients to connect.

    Video Games

    Games usually have a "game loop" that runs once a frame, indefinitely.

    Or... anything else that needs to keep running in the background with periodic checks.

    0 讨论(0)
  • 2020-12-09 21:50

    If you implemented a socket server (taken from: 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);
    ?> 
    
    0 讨论(0)
  • 2020-12-09 21:52

    Infinite loops are one of those tools you keep in a separate toolbox that doesn't get opened much as it is a tool of (almost) last resort.

    The best use I have found for them is with state machines or loops that are approaching state machines. This is because the exit condition is usually quite complex and cannot be put at the top or the bottom of the loop.

    0 讨论(0)
提交回复
热议问题