八萬張圖片,網頁跑不動了阿 Q___Q

edited 十月 2013 in CakePHP
大家好:
目前是有一個案子是這樣的,他的書籍資料很多,共有4000多筆,然後每一本書可以上傳5張不同角度的書本圖片
因為網頁又有很多縮圖的大小,所以每張圖片有四種size(分別先縮不同比例,然後再存檔)
所以這個書城的網站,竟然有4000*5*4= 8萬張圖片!!!!

網站愈開發是愈慢(邊寫程式,邊上傳書本資料),到最後發現是
把放圖片的資料夾 upload (內有8萬張圖) 移開webroot ,網頁開啟的速度 從 20sec 變成 4 sec

分別有作幾種不同的作法,來看是否能加速
===========================================================================
1. 一個upload資料夾裡面八萬張圖
> 20多sec
2. 一個upload資料夾裡面用圖片的檔名再切資料夾1000個----> 20多sec
3. upload資料夾移到webroot外面,超快,但讀不到半張圖片-> 4sec


請問一下各位大大~對於檔案很多的這種情況,大家都怎麼處理的呢? 怎樣可以讓網頁快一點,但又讀的到圖片呢
謝謝大家~





原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=6407

評論

  • edited 十一月 2011
    8萬張圖片是一次load出來?
    如果一次load完8萬張 20多秒我覺得超猛了
  • edited 十一月 2011
    不是一次load出來

    甚至沒有讀到半張的upload裡面圖片的網頁也會非常慢
  • edited 十一月 2011
    就把圖片分開放嚕,如果網域名稱是 www.xxx.com ,就弄一個 image.xxx.com ,然後透過類似 nginx 之類的伺服器獨立提供圖檔,現在應該蠻多人都這樣玩了

    要省事點就花些錢,把圖檔都塞到 amazon 去,這樣應該會更快些
  • edited 十一月 2011
    目前可能還是以在同一個主機為方向
    所以暫時不考慮用圖床的方式囉~

    因為很慢,所以就用xdebug 結果發現兇手是一個核心類別(/cake/libs) Folder.php 裡面的 read 方法
    /**
    * Returns an array of the contents of the current directory.
    * The returned array holds two arrays: One of directories and one of files.
    *
    * @param boolean $sort Whether you want the results sorted, set this and the sort property
    * to false to get unsorted results.
    * @param mixed $exceptions Either an array or boolean true will not grab dot files
    * @param boolean $fullPath True returns the full path
    * @return mixed Contents of current directory as an array, an empty array on failure
    * @access public
    */

    它的功能是就是資料夾裡面的東西撈出來,結果我的upload資料夾裡面又有1000個子資料夾,所以變的超慢 囧
    (可是我發現我不得不這樣分子資料夾~因為通通擠在同一個資料夾,速度上會快很多,可是檔案用ftp來查看的話 每次都看到不完整的檔案數,每次都顯示8000多張)

    想再請問各位大大
    用xdebug只知道哪一個funtion拖慢了~那要如何找到上一層是誰呼叫它的呢
    目前是想在他call read裡面 先動一點小手腳,避免他在upload下面狂讀取~
  • edited 十一月 2011
    找到原因囉~~
    在\cake\libs\configure.php的這一行
    $directories = $Folder->tree($path, array('.svn', '.git', 'CVS', 'tests', 'templates'), 'dir');
    他的功能有一點鐵大教的mvc裡面,那個指定路徑就把相關的class讀入來的功能,只是它太貼心是會遞迴把裡面的所有資料夾通通抓來讀一次
    所以他的array的第二個參數就是『不要』讀進來的路徑,預先cake已經把常用的例路徑寫出來

    現在我們只要把自已不想被讀到的路徑也加進去就ok啦
    $directories = $Folder->tree($path, array('upload','.svn', '.git', 'CVS', 'tests', 'templates'), 'dir');

    不過我在一個全新的cake專案放八萬張圖,整個專案也是跑的順順的,原來我之前專案設定過,我把view的資料夾又多指定在webroot資料夾
    所以cake就跑去把webroot裡面所有的圖檔,Javascirpt跑一遍,看裡面是不是有view的class
    所以發現這個好像對大家也沒有什麼幫助 , 因為大家應該沒有這個困擾才對 囧
Sign In or Register to comment.