2014-10-17 118 views
0

我只有一个选项可以从该文本文件中获取该数据,因此我无法使用数据库来存储该数据。从00:00起每天都会重新创建函数抓取数据的文件,所以它不会成为一个真正的大问题。最大2 MB的大小,并在一天结束时最多6000 - 7000行。 我的问题是,它抓取数据并将其显示在可以访问很多次的网页上(approximately up to 10,000 per day or less) - 它会以某种方式真的使服务器超载使用file()或对于这个小文件应该没问题?请让我知道。感谢您花时间阅读我的问题,并可能回答。从.txt文件file()会影响大小约2 MB的文件的性能吗?

示例行:

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)); 
    } 
+0

如果文件每天只更改一次,我会在第一次加载时缓存页面,并且仅在之后提供缓存版本 – kero 2014-10-17 21:56:01

+0

不,它在白天更新(在一天中逐行添加行),所以它需要显示来自行的最新新信息。所以我主要关心的是如果白天页面加载多一点,大小这些小文件是否仍然会使服务器超载?它具有在安装了nginx的Windows Server 2008上运行的16 GB RAM。 – Monk25 2014-10-17 21:58:23

+0

如果不知道更多细节,很难给出是/否的答案。这台服务器上还有什么事情,脚本运行的频率如何等等。PHP也不是最快的语言。将文件保存在RAM上可能会加快一点。我的建议:使用这个程序并监视你的服务器的负载一段时间。 – Rein 2014-10-17 22:30:57

回答

0

这真的取决于上下文。如果你不指望那大的流量,那应该没问题。否则,找到一种方法将其存储在的某处。数据库,RAM,核收容所 - 任何东西都可以完成这项工作,但不要每次都从文件系统读取数据。

我曾经有一个类似的问题,就是每秒要从远程服务器读取文本日志文件(每个大约10 MB)。我认为,因为没有许多用户,我可以采取简单的捷径,并直接从远程服务器获取它们。长话短说,当我发现服务器有效地拒绝了远程服务器时,那个简单的快捷方式反而失败了。

我最终不得不将所有数据存储在MySQL数据库中,同时保持跟踪每个文件的大小,并只从前一个读取周期结束时读取(以避免重复)。每个文件可以从远程请求,而不是每分钟最多一次。除了其他一些技巧之外,远程服务器正在高兴地开展工作,而我的服务器有足够新的数据满足我的需求。

tl; dr:根据您期望的负载量,用户数量和硬件数量来决定。如果你怀疑在某些时候,你将有巨大的负荷,让自己一个忙,不这样做就即时

干杯

+0

我完全理解并感谢您发布此详细解释。但是,我希望每天最多可以访问约10,000页的页面,您是否相信最大7000行的2 MB文件,这会是一个问题?该服务器由Limestone Networks托管,它是一个专用的Windows 2008 R2企业级16 GB RAM,在安装nginx的情况下运行。会有额外的服务运行,但我真的不相信它会超载,让我知道你的意见,根据我在评论中所说的话。再一次感谢你! – Monk25 2014-10-18 10:16:36

+0

同样,这将取决于这些服务的数量和他们所花费的资源,但否则我认为你现在会好起来的。每天10万个请求大约是1个请求/8.4秒,这是不值得担心的。如果你开始接近1次/ 1秒或2秒,我认为它会开始挣扎。 – NorthBridge 2014-10-18 17:15:47

0

你可以轮询间隔文件,说每次10分钟。第一次在一天中读取数据,然后缓存这两个数据,并保存在该读取中找到的文件的长度。每次后续轮询只能从最后一次读取的位置读取,直到文件的新结尾,并将该新数据添加到缓存。直到今天继续这样做。每次只读最后几行要添加的内容时,如果需要的话,可以在理性的范围内尽可能快地进行轮询,以确保获得最新行(但也许最后一行或两行对于立即显示,这意味着您可以减少投票次数以节省负担)。

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

+0

让我们假设每天大约需要访问10,000次,并从这个文本文件请求数据。当我们拥有2 MB和最多7000行的小文件时,您是否认为这可能是一个问题? – Monk25 2014-10-17 22:59:51