2012-08-31 45 views
5

我的主要原因是通過不同的選項獲得意見。我有一個目錄中的文件/大拇指與視頻相關,當我必須讓他們使用glob()函數glob(DIRECTORY./file_name*.jpg);並返回視頻的所有JPG文件的數組。PHP - 閱讀目錄與從數據庫中讀取

glob函數本身速度很快,但我仍然關心使用情況,因爲在每個頁面上可能有20到50個視頻,所以會有20到50個glob調用,我應該繼續使用它還是開始將數據放入數據庫從那裏獲取文件列表而不是glob(); ?

如果有更好的選擇,請讓我知道。

謝謝。

+0

考慮到一次有50多個用戶在線。 – ArslanCb

+0

這個問題的核心問題似乎是你「關注使用」,但並不清楚你的意思。請更清楚地解釋與您有關的問題,以便我們提供幫助。在你看來,你現在這樣做的問題究竟是什麼? –

+0

謝謝Nate。是的,我主要關心的是CPU /內存,或者你可以說性能。哪個選項更好。 – ArslanCb

回答

6

像往常一樣的性能問題,結果可能會有所不同,所以答案是:什麼是更快的速度爲

開始的地方是衡量您現在正在做的事情需要多少時間才能完成。一旦你完成了這些,問問自己:這足夠快嗎?這可能是因爲,儘管它可能不是最快的做法,但速度仍然非常快,所以速度不是問題。

處理頁面花費多少時間來獲取文件大小? 1%? 10%? 50%?這個比例越高,就越有必要考慮改變你做事的方式。

另外,網站整體性能如何?如果您將每頁加載的速度加倍,人們會注意到嗎?如果沒有,那麼即使你看到明顯的地方這樣做,也可能不值得進行性能調整。

如果您認爲自己可以做得更好,請使用數據庫實現功能並測量其速度。再次,結果與此可能是高度可變的。例如,如果您的數據庫處於沉重負載下,從數據庫獲取結果可能會慢得多。如果你有一個幾乎沒有使用的強大的數據庫,它可能會非常快。只有測試才能告訴你事實。

我會補充一點,你現在做事情的方式現在看起來更簡單和更易維護,因爲它會根據磁盤上的實際文件找到文件名。如果您嘗試使用數據庫,則必須擔心將數據庫中的文件名列表與文件系統中的文件列表同步。

但是,有一點需要注意的是,當您擁有一個包含大量文件的單個目錄時,許多文件系統的性能會更差。如果您遇到這種情況,請考慮將文件分成多個子目錄。一種流行的方法是製作名稱爲az的目錄,然後將所有以「a」開頭的文件放在「a」目錄中,所有以「b」開頭的文件放在「b」目錄中等等。但是,這可能只是一旦你有成千上萬的文件,這很重要,即使如此,它依賴於特定的文件系統和運行的硬件。

(編輯基於評論:)

既然你是在談論預先計算的結果和存儲那些在數據庫中,我認爲不是把東西在數據庫中的更好的方法是使用一個緩存服務器像http://memcached.org/。您可以將其視爲一種混合方法:您現在仍然按照現在的方式執行操作,但每次需要結果時,首先檢查緩存是否包含結果;如果是,則使用緩存的結果,否則計算新的glob。這樣可以避免數據庫和文件系統保持同步的問題,因爲舊的緩存條目可能會過期並被新的正確的條目取代。

+0

謝謝我現在會進行一項測試,它將在本地環境中進行,因此結果可能會有所不同,但在我上線之前仍然是一個很好的做法。 – ArslanCb

+0

文件名是唯一的,拇指文件就像是文件名1.jpg,文件名-2.jpg,文件名-3.jpg等等,每個視頻可以有1到30個大拇指。我正在考慮使用數據庫,因爲一旦保存了數據,我不必每次都使用glob。只是重新使用已保存的數據,並結合使用json(ed)數組可以更快... – ArslanCb

+0

我明白你的意思了。這本質上更快,因爲結果是爲您預先計算的。不過,我建議使用像memcached這樣的緩存服務器,它更適合這種用途。 –

0

如果您已經將視頻本身的信息存儲在數據庫中,則可以考慮在保存視頻數據的表中存儲每個視頻的拇指數。這要比查詢完整文件名的單獨表格要快得多,因爲您只需引用已經查詢過的記錄中的字段。這可能是你現在的兩個想法之間的一個很好的折中。但是,您必須確保拇指的名稱一致且可編程。例如,只有視頻123有4個大拇指,您纔可以生成:

/path/to/video_123/thumb_01.jpg 
/path/to/video_123/thumb_02.jpg 
/path/to/video_123/thumb_03.jpg 
/path/to/video_123/thumb_04.jpg 
+0

謝謝你,但拇指有不同的大小,用戶也可以上傳自定義的拇指和刪除現有的,文件名基本上是拇指的前綴。大拇指也可以有名稱像文件名-300x240-2.jpg 我的舊代碼只使用增量,我存儲的數字,但現在它的小不僅僅是一個增量。謝謝你的建議,我現在正在存儲一個json(ed)數組,並且我認爲它可以達到目的。 S.O擁有出色的人員和優秀的社區。 – ArslanCb