Php file()是否适用于平均5000-6000行,或者我必须编辑它以获得更好的性能?
文本文件(我的函数grab info)每天00:00重新创建,我的应用程序在白天缓慢启动,以逐行添加日志文件。该文件大约为1MB,一天结束时大约有6000行。所以,这不是一个很小的文件Php file()是否适用于平均5000-6000行,或者我必须编辑它以获得更好的性能?,php,Php,文本文件(我的函数grab info)每天00:00重新创建,我的应用程序在白天缓慢启动,以逐行添加日志文件。该文件大约为1MB,一天结束时大约有6000行。所以,这不是一个很小的文件该函数从文本文件中获取最新的21行,以显示游戏中最新的21次死亡/死亡,许多用户可以访问该脚本以检查日志统计信息。我的问题是如何使脚本具有更好的性能,因为file()实际上是逐行读取整个文件,那么,有什么更好的方法可以做到这一点呢?如果有很多人访问日志页面,从文本文件或6000行中显示此信息,这会影响性能吗?应该都
该函数从文本文件中获取最新的21行,以显示游戏中最新的21次死亡/死亡,许多用户可以访问该脚本以检查日志统计信息。
我的问题是如何使脚本具有更好的性能,因为file()
实际上是逐行读取整个文件,那么,有什么更好的方法可以做到这一点呢?如果有很多人访问日志页面,从文本文件或6000行中显示此信息,这会影响性能吗?应该都很好吧?
该文件为.txt格式的纯文本,以下是该文件中的示例行:
1,42,16, 201,stackoverflow_user, 1, 6762160, 39799, 9817242, 6762160, 39884, 10010545,stackoverflow_user, 2, 1351147, 1165, 483259, 1351147, 1115, 241630, 0
1,46,27, 201,[stackoverflow_user | stackoverflow_userother], 1, 4078465, 286991, 1594830, 4078465, 287036, 1643156,stackoverflow_user, 2, 1357147, 1115, 241630, 1357147, 1065, 120815, 0
我的功能:
# read a file into an array
$lines = file('C:/path/to/file.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
# flip our array over so the last lines of the file are first.
$lines = array_reverse($lines);
$n = 1;
$wanted = 21; # or however many lines you want.
$content = '';
foreach ($lines as $l) {
# treat the data as comma-separated values
$arr = explode(",", $l);
# if col 5 has multiple values, take the first one
if (preg_match("/\[(.+?) \|/", $arr[4], $matches)) {
$arr[4] = $matches[1];
}
# is arr[4] the same as arr[12]?
if ($arr[4] !== $arr[12]) {
# these two are not equal, so use these values
$data = array('rank-pos' => $n++, 'rank-name' => $arr[4], 'rank-dmuser' => $arr[12]);
$content .= Template::Load('rankinguserdm-' . ($n % 2 == 1 ? 2 : 1), $data);
}
# have we got enough data?
if ($n === $wanted) {
break;
}
}
$this->content = Template::Load('user_rankingsdm', array('rankings' => $content));
}
如果您在unix系统上运行,请考虑调用tail
<?php
$file = log.txt;
$last_lines = `tail -n 21 $file`; // backticks indicate system call
print_r($last_lines);
为什么不使用数据库?SQLite立即浮现在我的脑海中…我不能使用数据库,因为应用程序正在向该文本文件写入信息,我必须使用该功能获取该信息并将其显示在我的网站上。另外,我正在MSSQL Server 2005上运行。所以,我的问题是,file()
是否适合这样做(我担心的是,如果有更多的人访问日志统计页面来查看日志,从而导致服务器过载?!)或者我必须使用fopen
或其他什么?你可能对阅读感兴趣是的,我明白了。但是您可以编写一个简单的服务(由守护进程运行,例如所有30个守护进程)来读取文件并将其存储在数据库中。然后你的应用程序从那里读取它的所有好处。我很确定数据库可以很好地处理你的需求,并且不会“过载”。而且它们比文件解决方案更具可扩展性我正在Windows Server 2008 R2 Enterprise上运行。所以,tail
不是我的选择/你能使用windows的等效软件吗?我明白,但是当我的文件大小约为1MB,有5000-6000行时,这会比file()
有更好的性能提升吗?