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

时间:2018-07-18 14:18:49

标签: php file laravel-5 handle

我开发了此功能,可以从文件中读取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):无法打开流:太   许多打开的文件   C:_Projekte \ Selenium \ vendor \ vlucas \ phpdotenv \ src \ Loader.php在线   135

我正在使用php方法file。 它不返回句柄,而是一个数组。我不确定该功能是否关闭了句柄。我只能看到它的声明:

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

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


我正在以特定时间间隔(每个250毫秒)获取日志文件的最后100行。我猜这些句柄是打开的,但没有被file()

关闭

1 个答案:

答案 0 :(得分:1)

我通过注释掉原始代码改进了原始方法...

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);


}