2014-10-17 117 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