2011-01-13 239 views
1

我有一个循环,说:如何设置循环的时间限制?

$lines = file('file.txt');  

foreach ($lines as $line) { 

    // some function 

} 

有些时候,这需要更多的时间来完成一个循环,如果数据不可用。那么,如何为每个循环设置一个时间限制,如果有任何信息不可用,它将移动到下一个?

+0

您需要显示更多的代码,因为此时您的问题无法回答。 “有些时候,如果数据不可用,则需要更多时间才能完成一个循环”对于您当前的发布代码没有意义。 – thirtydot 2011-01-13 10:09:34

+0

对不起,但我不明白这个问题。你能否详细说明一下? – davogotland 2011-01-13 10:10:25

回答

5

你应该根本没有解决这个时间限制!使用时间限制可能会长期产生各种问题。我会尽量说“时间限制是一种代码味道”。

而是首先检查,如果数据可用,如果不可用,则不循环。

+0

我在说循环里面的函数......其实循环里面的函数需要太多的时间。 – mathew 2011-01-13 10:29:11

+0

在这种情况下,您应该向我们展示循环内的函数。但反正,在代码中使用时间限制通常是一个代码气味=坏。 – markus 2011-01-13 10:33:52

1

用循环前的time()存储当前时间,并将循环开始时的当前时间与当前时间进行比较,并且如果设定时间已过,则中断。

正如tharkun所说,虽然,你应该首先检查数据是否可用。如果文件外部更改,则会想到filemtime()。

1

您应该测试以查看数据是否可用而不是创建计时器。

$lines = file('file.txt'); 

if (!empty($lines)) { 
    foreach ($lines as $line) { 
    // some function 
    } 
} 
1

您只需检查$ lines数组中是否有任何数据,然后尝试使用foreach对它进行迭代。例如:

<?php 
    $lines = file('file.txt'); 
    if (!empty($lines)) { 
     foreach ($lines as $currentLine) { 
      ... 
     } 
    } 
?> 

这就是说,对于大文件(其中通过使用文件可能不适合在内存中产生的阵列),你应该同时使用while循环读取一行直到文件的末尾( EOF)标记被找到。

例如:

<?php 
    $fileHandle = fopen("test.txt"); 
    if(is_resource($fileHandle)) { 
     while (!feof($fileHandle)) { 
      $currentLine = fread($fileHandle); 
     } 
    fclose($handle); 
    } 
?> 
1

根据这个代码,如果数据不可用,循环不开始了! 所以,问题需要更具体。

2

你怎么去取决于循环内部的内容。

如果它是一个嵌套的循环和持续时间长,以迭代的内部循环数的出现是由于,那么你就可以在你的代码如检测到这一点:

foreach ($lines as $line) { 
    $iters=strtok($line, ','); 
    $start_iter=time(); 
    for ($x=0; $x<$iters; $x++) { 
     ... do something here 
     if (time()-$start_iter>600) { 
      print "abandoning $line after $x iterations\n"; 
      break; 
     } 
    } 
} 

OTOH,如果函数本质上是原子,例如

foreach ($lines as $line) { 
     mysql_query($line); 
} 

然后,控件将永远不会返回到您的代码,直到操作完成。但是,这并不意味着它不可能中断处理并继续到下一行 - 有两种方法可以做到这一点:

1)使用pcntl_alarm触发信号处理程序 - 请注意,它本身并不能解决在上述情况下的问题 - 因为在信号处理程序完成时,被调用的函数将会重新开始 - 在某些情况下,强制终止函数可能会过早终止。

2)在单独的进程中运行循环的内部部分,并在进程溢出时终止进程。

查看pcntl函数以获取更多细节 - 注意这些函数仅适用于Linux/Unix/POSIX环境。