我开发了此功能,可以从文件中读取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()
答案 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);
}