ThinkPHP3.2.2調試模式下正常訪問,關閉調試模式,部署時出現刪出緩存第一次沒錯,第二次開始錯誤。

我碰到的錯誤如下:

ThinkPHP3.2.2 { Fast & Simple OOP PHP Framework } -- [ WE CAN DO IT JUST THINK ]

上圖:


看到網上大多數人都碰到,但沒很好解決,確實很頭痛,沒辦法只能去閱讀源碼。在同事的幫助下,就愉快地去翻源,看框架執行流程:

1.從入口文件開始:index.php  裏面有這句(require './ThinkPHP/ThinkPHP.php';),跳到ThinkPHP.php;

2.ThinkPHP.php 裏面的96行:Think\Think::start();可以看到,跑這函數裏面去了,跳到Think.class.php;

3.Think.class.php 因爲是部署模式,所以執行到裏面的42行Storage::load($runtimefile);發現沒法跳了。直接去找ThinkPHP/Library/Storage.class.php;

4.Storage.class.php; 源碼:static public function connect($type='File',$options=array()) {
        $class  =   'Think\\Storage\\Driver\\'.ucwords($type);
        self::$handler = new $class($options);
    }

我們看到,它去取到了一個叫“Flie”的文件,找了下在找到了它ThinkPHP/Library/Storage/File.class.php,打開看看。

5.File.class.php 裏面果然有第3步的load方法,在代碼75行。public function load($_filename,$vars=null){
        if(!is_null($vars))
           extract($vars, EXTR_OVERWRITE);
          include $_filename;
       }

最後鎖定,錯誤是發生在這句代碼。

6.可以測試下結果:(1).

public function load($_filename,$vars=null){
      if(!is_null($vars))
        extract($vars, EXTR_OVERWRITE);

echo $_filename;
      die();

        include $_filename;
 }

結果如下:


(2)刪掉緩Runtime存再測.

public function load($_filename,$vars=null){
      if(!is_null($vars))
        extract($vars, EXTR_OVERWRITE);

        include $_filename;

echo $_filename;
      die();

 }

結果如下:


7.第6步結果可以看到,問題就出在include 這個文件./Application/Runtime/common~runtime.php時出錯了。爲什麼呢?

文件如下:

8.在同事幫助下,終於知道原因,如圖:是因爲我Common/Common文件夾下的function.php引入了一個user.function.php路徑有問題。

如果直接用require_once 'user.function.php';這樣在部署情況下common~runtime.php就沒辦法正確解析,之前調試模式是沒問題的。

最後我們在導入文件的時候加上正確路徑就可以了:如圖改成require_once APP_PATH.'Common/Common/'user.function.php';,問題到這裏就解決了。


最後再說明一點:記得關閉調試模式,要把Runtime文件夾刪除,到時測試成功通過。

如果你碰到的是和我一樣的問題,希望能幫到你,最後希望轉載的小朋友,加上原創鏈接,費老大勁才弄出來的;




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章