大家好:
最近發現寫的cake愈來愈慢
debug 一下才發現~
我專案跑的流程怪怪的
一般來說是 輸入網址→ .htaccess → webroot下的 index.php → 再叫 dispatch() → 再看是哪一個controller 和哪一個action
可是我現在的專案很怪
如果我的網頁裡面有
<img src="path/notFindImage.jpg"> 就是專案中沒有這個圖檔
就是圖檔的路徑多跑一次下面的流程 <有幾個找不到的圖檔,就多跑幾次>
輸入網址<path/notFindImage.jpg>→ .htaccess → webroot下的 index.php → 再叫 dispatch() → 再看是哪一個controller 和哪一個action
可是我不知道index.php前面還有跑什麼動作
因為到這裡就不是知道從哪查錯誤了 Q_Q
感覺上index.php就算是第一個跑的php程式了
請教大家了T_T
原始討論:
http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=6625
評論
這和 apache rewrite rule 寫法有關吧
是可以判斷附檔名不會去呼叫 index.php , 避免造成額外 loading
例如以下寫法 , 以下的附檔名不會呼叫到 index.php
RewriteRule !\.(js|ico|gif|jpg|png|css)$ /index.php
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
也因為這樣可以做一些圖片的權限管理(有的人看的到 有的看不到)
或是 js 和 css 的檔案壓縮功能
如果把部份圖檔不讓它經過index.php 好像會少一些功能的感覺QQ
若你的專案對於圖檔也有控管權限問題 , 確實都該轉給 php 負責
所以看狀況使用 , 例如 rule 可以針對路徑判別該不該交給 php
一個專案至少 logo 是大家能看的吧 , 沒有權限問題 , 這個就可以給 apache 作
需要有權限控管的圖片 , 應該是被你集中在某個目錄 , 針對這個目錄的路徑再交給 php 作
而 js , css 壓縮功能 , apache 有壓縮模組 , 犯不著給 php 作降低效能
他不是我之前誤解的通通轉到index.php 去處理
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
而是找不到的資源才轉過去 index.php
一般的圖片應該是找的到,而就直接顯示了
而controller/action 這種寫法,應該會被歸類到 找不到的資源 ---> 所以他有可能是controller 再去解析哪一個controller 和action
所以造成了 我有些圖檔是找不到路徑,他就一直以為他是一個controller 試圖要解析它
卻失敗結果就call CakeErrorController 但他是也繼承app_controller
結果就一直反覆呼叫app_controller ,因為我在app_controller 有寫一些 例行性的檢查動作
就變成瀏覽一個網頁,但時間很久
想了很久pigo大大給的建議
所以應該是 圖片 css js那些資源都跨過index.php
遇到要權限管理的資源,再利用 特殊的網址 ex: /download/xx.zip
這個時候看到了出現/download/路徑才丟到index.php 去執行
請問是這個意思嗎?
確實是找不到路徑及找不到檔案 , 然後就通通導給 index.php
應該可以先測試用以下策略
1. 先判斷找不到的路徑及檔案(你原本的寫法)
2. 再判斷是否不是 /images /css 等靜態目錄不需要權限的
3. 上述條件成立了 , 才導到 index.php
這樣的做法 , 應該可以讓你 loading 少很多 , 找不到的圖檔Apache應該自然會丟出 404 Not found , 且 /download 沒有寫在上述條件2中,應該也會導給 index.php 才對
可是我又去抓了一個全新的cake 1.3.6 版來測試
也是故意放幾個錯誤圖庫連結,結果發現他並不是乖乖造下面的規則跑
它就是很聰明,錯誤的圖片不會傻傻的跑到index去
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d #如果目录存在就直接访问目录不进行RewriteRule
RewriteCond %{REQUEST_FILENAME} !-f #如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
按照上面三行規則就是應該是 沒有的資訊會跑到第三行去的index.php
不過cake官方都是這樣寫應該是有他的原因
不過真的想不到他的原因
另外把 RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 改寫成 RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php?url=$1 [QSA,L]
速度有大幅提升 不過本來$this->params有中文參數的地方都被encode過了
造成本來的專案噴出一堆錯誤 > <