PHP-如果使用"file()",打开的文件太多



我开发了这个函数,它从文件中读取N行并输出。

public function readLinesFromFile($file, $maxLines, $reverse=false)
{
$lines = file($file);
if ($lines == false) {
echo "Datei '$file' konnte nicht geöffnet werden.";
return false;
}
if ($maxLines > count($lines)) {
echo "$maxLines ist größer als die Anzahl der Zeilen in der Datei.";
return false;
}
if ($reverse) {
$lines = array_reverse($lines);
}
$tmpArr = array();
for ($i=0; $i < $maxLines; $i++) {
array_push($tmpArr, $lines[$i]);
}
if ($reverse) {
$tmpArr = array_reverse($tmpArr);
}
$out = "";
for ($i=0; $i < $maxLines; $i++) {
$out .= $tmpArr[$i] . "</br>";
}
return $out;
}

一切都很好,但现在我突然明白了:

警告:文件(C:\_Projekte\selenium.env(:无法打开流:Too中有许多打开的文件C: _Projekte\selenium\vendor\vlucas\phpdotenv\src\Loader.php在线135

我使用的是php方法文件。它不返回句柄,而是返回数组。我不确定这个功能是否关闭了把手。我只能看到它的声明:

function file(string $filename, int $flags = 0, $context = null): array {}

这是PHP错误还是我的错?我知道我可以增加打开文件的限制,但这不是一个解决方案。我应该使用file()以外的其他方法吗?


我正在以特定的间隔(每250毫秒(获取日志文件的最后100行。我想file()打开了把手,但没有关闭

我用注释掉的原始代码改进了原始方法。。。

public function readLinesFromFile($file, $maxLines, $reverse=false)
{
$lines = file($file);
if ($lines == false) {
echo "Datei '$file' konnte nicht geöffnet werden.";
return false;
}
if ($maxLines > count($lines)) {
echo "$maxLines ist größer als die Anzahl der Zeilen in der Datei.";
return false;
}
/*
*** NONE OF THIS IS NEEDED ***
// array_splice better, removes double reverse...
if ($reverse) {
$lines = array_reverse($lines);
}
// push loop not needed, just use array_splice...
$tmpArr = array();
for ($i=0; $i < $maxLines; $i++) {
array_push($tmpArr, $lines[$i]);
}
// reverse not needed as array_splice solves this too..
if ($reverse) {
$tmpArr = array_reverse($tmpArr);
}
// join instead of concatenate loop
$out = "";
for ($i=0; $i < $maxLines; $i++) {
$out .= $tmpArr[$i] . "</br>";
}
return $out;
*/
$tmpArr = $reverse ?
array_slice( $lines, -$maxLines) :
array_slice( $lines, 0, $maxLines);
// don't even need $tmpArr local but will leave it in
return join( '</br>', $tmpArr);

}

最新更新