我有一个循环,说:如何设置循环的时间限制?
$lines = file('file.txt');
foreach ($lines as $line) {
// some function
}
有些时候,这需要更多的时间来完成一个循环,如果数据不可用。那么,如何为每个循环设置一个时间限制,如果有任何信息不可用,它将移动到下一个?
我有一个循环,说:如何设置循环的时间限制?
$lines = file('file.txt');
foreach ($lines as $line) {
// some function
}
有些时候,这需要更多的时间来完成一个循环,如果数据不可用。那么,如何为每个循环设置一个时间限制,如果有任何信息不可用,它将移动到下一个?
用循环前的time()存储当前时间,并将循环开始时的当前时间与当前时间进行比较,并且如果设定时间已过,则中断。
正如tharkun所说,虽然,你应该首先检查数据是否可用。如果文件外部更改,则会想到filemtime()。
您应该测试以查看数据是否可用而不是创建计时器。
$lines = file('file.txt');
if (!empty($lines)) {
foreach ($lines as $line) {
// some function
}
}
您只需检查$ 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);
}
?>
根据这个代码,如果数据不可用,循环不开始了! 所以,问题需要更具体。
你怎么去取决于循环内部的内容。
如果它是一个嵌套的循环和持续时间长,以迭代的内部循环数的出现是由于,那么你就可以在你的代码如检测到这一点:
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环境。
您需要显示更多的代码,因为此时您的问题无法回答。 “有些时候,如果数据不可用,则需要更多时间才能完成一个循环”对于您当前的发布代码没有意义。 – thirtydot 2011-01-13 10:09:34
对不起,但我不明白这个问题。你能否详细说明一下? – davogotland 2011-01-13 10:10:25