我确实有一个循环,说:
$lines = file('file.txt');
foreach ($lines as $line) {
// some function
}
如果数据不可用,有时需要更多时间来完成一个循环。那么我该如何为每个循环设置一个时间限制,所以如果没有任何信息,它会移到下一个?
答案 0 :(得分:5)
你应该完全没有时间限制解决这个问题!从长远来看,使用时间限制可能会产生各种问题。我甚至会说“时间限制是一种代码味道”。
首先检查,如果数据可用,如果没有,则不要循环。
答案 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触发信号处理程序 - 请注意,在上述情况下,这不能解决问题 - 因为在完成信号处理程序时,调用的函数将恢复 - 在某些情况下可能会强制提前终止lopped功能。
2)在一个单独的过程中运行循环的内部部分,如果它超出则终止该过程。
有关详细信息,请查看pcntl函数 - 请注意,这些仅适用于Linux / Unix / POSIX环境。
答案 2 :(得分:1)
将当前时间与循环前的时间()一起存储,并将其在循环开始时与当前时间进行比较,如果已经过了设定时间,则将其中断。
正如tharkun所说,你应该首先检查数据是否可用。如果在外部更改文件,则会想到filemtime()。
答案 3 :(得分:1)
您应该测试数据是否可用而不是创建计时器。
$lines = file('file.txt');
if (!empty($lines)) {
foreach ($lines as $line) {
// some function
}
}
答案 4 :(得分:1)
在尝试使用foreach迭代它之前,您只需要检查$ lines数组中是否有任何数据。例如:
<?php
$lines = file('file.txt');
if (!empty($lines)) {
foreach ($lines as $currentLine) {
...
}
}
?>
也就是说,对于大文件(使用文件生成的数组可能不适合内存),您应该使用while循环一次读取一行,直到找到文件末尾(EOF)标记。 / p>
例如:
<?php
$fileHandle = fopen("test.txt");
if(is_resource($fileHandle)) {
while (!feof($fileHandle )) {
$currentLine = fread($fileHandle);
}
fclose($handle);
}
?>
答案 5 :(得分:1)
根据此代码,如果数据不可用,则循环根本不启动! 所以,问题需要更具体。