Ne zaman sonsuz döngüler PHP yararlıdır vardır?

10 Cevap php

Dedi Paul Hudson büyük online PHP öğreticiler okurken

Perhaps surprisingly, infinite loops can sometimes be helpful in your scripts. As infinite loops never terminate without outside influence, the most popular way to use them is to break out of the loop and/or exit the script entirely from within the loop whenever a condition is matched. You can also rely on user input to terminate the loop - for example, if you are writing a program to accept people typing in data for as long as they want, it just would not work to have the script loop 30,000 times or even 300,000,000 times. Instead, the code should loop forever, constantly accepting user input until the user ends the program by pressing Ctrl-C.

Bana PHP sonsuz döngüler nasıl kullanılacağını basit bir çalışan bir örnek verir misiniz?

10 Cevap

Monitoring applications

Eğer sunucuların durumunu izler ve sorun çıkarsa bir e-posta gönderen bir arka plan işlemi varsa. Bu repeatably sunucularını kontrol etmek için sonsuz bir döngü olurdu (yineleme arasında bazı duraklama.)

Server listening for Clients

Bağlanmak için yeni müşteriler için beklerken engelleme, sonsuz döngü olur, bağlantıları için bir yuva dinleyen bir sunucu komut dosyası var.

Video Games

Oyunlar genellikle süresiz, bir zamanlar bir çerçeve çalışan bir "oyun döngü" var.

Ya da ... periyodik kontrolleri ile arka planda çalışmasını sağlamak için gereken başka bir şey.

Bir soket sunucusu uygulanan eğer (alınan: 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);
?>

Belki de bir komut satırı PHP uygulama yazarken yararlıdır? PHP-komut web sunucusu tarafından çalıştırıldığında (Apache veya başka) onlar ömür boyu varsayılan (veya elle yapılandırma dosyasına bu sınırı değiştirebilirsiniz) ile 30 saniye ile sınırlı olduğundan.

Ben şimdiye kadar diğer yanıtlar ile katılmıyorum olacak, ve bir şeyler konusunda dikkatli olmak eğer, onlar bir yer var, asla öneririz ediyorum.

Kapatmak istediğiniz bazı durum en azından bu nedenle, bu olmalı, her zaman varken (test if shutdown not requested) ya da (still able to meaningfully run)

Ben insanların durumu kullanmak ve sonlandırmak için php SIGINT gibi şeylere güvenmeyin zaman pratikte zamanlar olduğunu düşünüyorum, ama bu çalıştığını bile, bence iyi bir uygulama değildir.

Döngü içinde testi koyarak ve eğer başarısız kırılma riski o kolay gelecekte değiştirilecek kod yanlışlıkla sonsuz bir döngü oluşturmak için yapar olmasıdır. Örneğin, başka bir döngü içinde while döngüsünün içeriğini sarın olabilir, ve sonra aniden break ifadesi süreliğine dışarı almaz ...

for (; ;) ya da (1) mümkün kaçınılması, ve hemen hemen her zaman mümkün gerekirken.

Paul Biggar arka planda çalıştırmak için sonsuz bir döngü kullanan bir make script for LaTeX projects hangi yayınlanan ve sürekli LaTeX kaynaklarını yeniden çalışır gelmiştir.

Senaryoyu sonlandırmak için tek yolu (Ctrl + C kullanarak örneğin) dışarıdan onu öldürmektir.

(Verilen, PHP (Bash, aslında) ama aynı script iyi yerine PHP uygulanan olabilir.)

Kullanıcı girişi için ...

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

Bazen yerine improperly named "infinite" loop gitmek için en iyi yol olabilir okunabilirliği korumak için çok uzun bir çıkış koşulu olurdu bir döngü.

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

Ben bir nokta cevapsız ediliyor düşünüyorum ... gerçekten sonsuz döngüler yerine, (siz onları sonsuza kadar sıkışmış olacak) while(true){...} ve olmayan önemsiz çıkış koşulları (örn. bu gelen var ne zaman işbirliği yararlıdır yok bir üçüncü taraf kitaplığında, ya da hesaplamak için çok fazla zaman alacaktı ama döngü, ya da kullanıcı girişi dayanarak bir şey) içinde aşamalı olarak çalışmış olabilir bir limit.

Her döngü özlü break kullanmadan bir for, while veya do döngü olarak ifade edilebilir değil şaşırtıcı olmamalıdır.

Komut satırı uygulamaları oluştururken Sonsuz döngüler özellikle faydalıdır. Kullanıcı durdurmak için söyleyene kadar sonra uygulama çalışacaktır. (Kullanıcı girişi "çıkın" olduğunda, örneğin, bir kırılma / çıkış-deyimini ekleyin)

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

  do_something_with_input();

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

Sonsuz döngüler (neredeyse) son çare bir araçtır kadar açılmış almaz ayrı bir araç kutusu tutmak bu araçlardan biridir.

Ben onlar için bulduk iyi kullanımı devlet makineleri veya devlet makineleri yaklaşıyor döngüler ile. Çıkış durum genellikle oldukça karmaşık ve üst veya döngünün alt konamaz olmasıdır.