在阅读Paul Hudson的精彩在线 PHP 教程时,他说
也许令人惊讶的是,无限循环 有时可以帮助你 脚本。从来没有无限循环 在没有外界影响的情 最常用的方法是使用它们 突破循环和/或退出 完全来自循环内的脚本 只要条件匹配。您 也可以依靠用户输入 终止循环 - 例如,if 你正在写一个接受的程序 人们只要输入数据就可以了 他们想要,它只是不会工作 让脚本循环30,000次或 甚至300,000,000次。相反, 代码应该永远循环 接受用户输入直到用户 按Ctrl-C结束程序。
请您给我一个如何在PHP中使用无限循环的简单运行示例?
答案 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
的情况下,并非每个循环都可以简洁地声明为while
,do
或break
循环,这一点不足为奇。
答案 11 :(得分:0)
无限循环是您保存在单独工具箱中的工具之一,它不会被打开,因为它是(几乎)最后的工具。
我发现它的最佳用途是使用接近状态机的状态机或循环。这是因为退出条件通常非常复杂,不能放在循环的顶部或底部。