file()会影响大小约为2MB的文件的性能吗


Will file() affect the performance for files approximately 2 MB in size?

我只有一个选项可以从这个文本文件中获取数据,所以我不能使用数据库来存储这些数据。函数抓取数据的文件每天00:00都会被重新创建,所以它不会变得很大。最大2MB的大小,一天结束时最多6000-7000行我担心的是,它会抓取数据并将其显示在可以多次访问的网页上(approximately up to 10,000 per day or less)——它真的会以某种方式使用file()过载服务器吗?还是对于这个小文件来说应该没问题请告诉我。谢谢你花时间阅读我的问题和可能的答案。

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

这实际上取决于上下文。如果你不希望有那么大的流量,那么它应该没问题。否则,找到一种方法将其存储在的某个地方。数据库、RAM、核避难所——任何东西都可以,只是不要每次都从文件系统中读取。

我曾经遇到过类似的问题,必须每秒从远程服务器读取几次文本日志文件(每个大约10MB)。我想,由于没有那么多用户,我可以采取简单的快捷方式,每次都直接从远程服务器获取。长话短说,当我的服务器有效地拒绝远程服务时,这个简单的快捷方式适得其反。

我最终不得不将所有数据存储在MySQL数据库中,同时跟踪每个文件的大小,并且只从上一个读取周期结束时读取(以避免重复)。每个文件都可以从远程请求,而不是每分钟最多一次。除了一些其他技巧外,远程服务器做得很好,我的服务器有足够的新鲜数据来满足我的需求。

tl;dr:根据你期望的负载、用户数量和你拥有的硬件来决定。如果你怀疑在某个时候你会有巨大的负载,帮自己一个忙,不要在飞行中

干杯

您可以每隔一段时间轮询一次文件,比如每10分钟轮询一次。一天中第一次读取数据,然后缓存这两个数据,并保存在读取中找到的文件的长度。每次后续轮询都只从上次读取的位置读取,直到文件的新末尾,并将新数据添加到缓存中。一整天都这样做。每次你只阅读要添加的最后几行,所以如果有必要的话,你可以在合理的范围内尽可能快地进行轮询,以确保你得到了最新的一行(但可能最后一两行并不重要,不能立即显示,这意味着你可以减少轮询次数以节省负载)。

你没有说网页可能被访问多少次——如果每天只有两次,那么你的文件服务器就不会过载,但如果每天有一百万次,是的,几乎肯定会!但从某种意义上说,正常生活中的实际访问次数是无关紧要的,如果有一段时间可能会在网页上运行的话。例如,假设这是一家公司的网站,假设有一天股价突然飙升,全世界有一半的人和他的狗都想看看这个网站。如果网络主机是可靠的,它可能会应付,但您的文件服务器可能会出现问题。