我碰到的錯誤如下:
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文件夾刪除,到時測試成功通過。
如果你碰到的是和我一樣的問題,希望能幫到你,最後希望轉載的小朋友,加上原創鏈接,費老大勁才弄出來的;