cakephp 的執行流程有異常

edited 十一月 -1 in CakePHP
大家好:
最近發現寫的cake愈來愈慢
debug 一下才發現~

我專案跑的流程怪怪的
一般來說是 輸入網址→ .htaccess → webroot下的 index.php → 再叫 dispatch() → 再看是哪一個controller 和哪一個action

可是我現在的專案很怪
如果我的網頁裡面有
image 就是專案中沒有這個圖檔

就是圖檔的路徑多跑一次下面的流程 <有幾個找不到的圖檔,就多跑幾次>
輸入網址→ .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

評論

  • edited 五月 2012
    照你所說 , 沒有實際圖檔 , 但 html 有呼叫圖檔的網址 , 確實是會跑 index.php (預設都是首頁的 Controller Action) , 所以網頁上會出現叉燒包的圖案 , 因為 download 下來的是首頁產生 html

    這和 apache rewrite rule 寫法有關吧
    是可以判斷附檔名不會去呼叫 index.php , 避免造成額外 loading
    例如以下寫法 , 以下的附檔名不會呼叫到 index.php

    RewriteRule !\.(js|ico|gif|jpg|png|css)$ /index.php
  • edited 五月 2012
    可是cake預設應該是通通都轉向過去
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

    也因為這樣可以做一些圖片的權限管理(有的人看的到 有的看不到)
    或是 js 和 css 的檔案壓縮功能

    如果把部份圖檔不讓它經過index.php 好像會少一些功能的感覺QQ
  • edited 五月 2012
    是的
    若你的專案對於圖檔也有控管權限問題 , 確實都該轉給 php 負責
    所以看狀況使用 , 例如 rule 可以針對路徑判別該不該交給 php
    一個專案至少 logo 是大家能看的吧 , 沒有權限問題 , 這個就可以給 apache 作
    需要有權限控管的圖片 , 應該是被你集中在某個目錄 , 針對這個目錄的路徑再交給 php 作

    而 js , css 壓縮功能 , apache 有壓縮模組 , 犯不著給 php 作降低效能
  • edited 六月 2012
    其實再仔細看cakephp的 的預設 .htaccess 才發現
    他不是我之前誤解的通通轉到index.php 去處理


    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]


    而是找不到的資源才轉過去 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 去執行

    請問是這個意思嗎?
  • edited 六月 2012
    看你預設的 Rule
    確實是找不到路徑及找不到檔案 , 然後就通通導給 index.php

    應該可以先測試用以下策略
    1. 先判斷找不到的路徑及檔案(你原本的寫法)
    2. 再判斷是否不是 /images /css 等靜態目錄不需要權限的
    3. 上述條件成立了 , 才導到 index.php

    這樣的做法 , 應該可以讓你 loading 少很多 , 找不到的圖檔Apache應該自然會丟出 404 Not found , 且 /download 沒有寫在上述條件2中,應該也會導給 index.php 才對
  • edited 六月 2012
    雖然照著上面前輩說好像都很合理,測試也是對的
    可是我又去抓了一個全新的cake 1.3.6 版來測試
    也是故意放幾個錯誤圖庫連結,結果發現他並不是乖乖造下面的規則跑
    它就是很聰明,錯誤的圖片不會傻傻的跑到index去


    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d #如果目录存在就直接访问目录不进行RewriteRule
    RewriteCond %{REQUEST_FILENAME} !-f #如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]


    按照上面三行規則就是應該是 沒有的資訊會跑到第三行去的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過了
    造成本來的專案噴出一堆錯誤 > <




Sign In or Register to comment.