2009-07-29 56 views
2

我使用PHP來創建一個簡單的緩存系統,但是我將在腳本的一次運行中緩存多達10,000個文件。目前我使用的是PHP將大量文件寫入一個目錄

$file = "../cache/".$id.".htm"; 
$handle = fopen($file, 'w'); 
fwrite($handle, $temp); 
fclose($handle); 

($ ID是被分配到排在數據庫中隨機字符串)

但似乎有點慢一個簡單的循環,有沒有更好的方法來做到這一點?此外,我還在某處讀到某些操作系統上無法將數千和數千個文件存儲在一個目錄中,這與CentOS或Debian有關嗎?請記住,該文件夾最終可能會有超過一百萬個小文件。

簡單的問題,我想,但我不想讓這個代碼縮放,然後發現我做錯了,我現在只在一次測試10-30頁。

回答

3

請記住,在UNIX中,一切都是文件。

當你把許多文件放到一個目錄中時,有些東西需要跟蹤這些文件。如果你這樣做: -

ls -la 

你可能會注意到'。'已經發展到一定的規模。這是存儲10000個文件的所有信息的地方。

每次查找,每寫入該目錄將涉及解析該大型目錄項。

你應該實現某種目錄哈希系統。這將涉及在目標目錄下創建子目錄。

例如。

/somedir/a/b/c/yourfile.txt /somedir/d/e/f/yourfile.txt

這會保持每個目錄條目非常小的規模,加快IO操作。

+0

好吧,這實際上很容易做到,因爲我的系統會這樣,謝謝,這是我正在尋找的信息。 – zuk1 2009-07-29 14:54:25

0

文件I/O一般來說比較慢。如果您循環使用超過1000個文件,將它們寫入磁盤,則緩慢可能是正常的。

如果這是一個可行的選擇,我會把它轉移到夜間工作。

+0

嗯,我還可以擁有它,使其只在頁面請求緩存,我在這種情況下,這將是一個更好的選擇是不是? – zuk1 2009-07-29 14:51:50

1

您可以在一個目錄中有效使用的文件數量不是操作。系統,但依賴於文件系統。

您可以通過獲取文件名的md5散列來有效地拆分緩存dir,取其第一個1,2或3個字符並將其用作目錄。當然,如果不是exsists,並且在從緩存中檢索文件時使用相同的方法,您必須創建dir。

對於幾萬個,2個字符(從00到ff的256個子集)就足夠了。

0

你可能想看看memcached作爲文件系統的替代。使用內存將帶來巨大的性能提升。

http://php.net/memcache/