項目在開發階段運行的好好的(Debug=true),上線后(Debug=false)其中有一個頁面報“對不起,您的頁面暫進無法找到!”錯誤。摸不清頭腦,看看了這個頁面也沒有什么兩樣,可就是提示這句話,也不知道是哪一步報錯了。最后用代碼中用全文檢索搜索這句話發現:
\ThinkPHP\Conf\convention.php
/* 錯誤設置 */ 'ERROR_MESSAGE' => '對不起,您的頁面暫進無法找到!',//錯誤顯示信息,非調試模式有效 'ERROR_PAGE' => '', // 錯誤定向頁面 'SHOW_ERROR_MSG' => false, // 顯示錯誤信息 'TRACE_MAX_RECORD' => 100, // 每個級別的錯誤信息 最大記錄數
由此可見出現此提示是因為這里配置了出錯后的提示語,再看到后面的一個配置 'SHOW_ERROR_MSG' => false, // 顯示錯誤信息 這里已配置不顯示錯誤信息,也就是說出任何錯誤都會提示"ERROR_MESSAGE"配置的內容,因此我們給配置為'SHOW_ERROR_MSG' => true,然后刪除runtime里面的內容,再刷新頁面,果然看到了錯誤提示:
Class 'Core\Log' not found
這個錯誤更麻煩,找了半天,首先出錯頁面沒有引用Core\Log,唯獨只有這一個頁面報錯,還是摸不清頭腦。最頭痛的是,一量把Debug=false或SHOW_PAGE_TRACE=true開啟頁面調試就不會有此錯誤,在網上也找不到類似的資料。沒辦法,一句代碼一句代碼的扣:
首先將出錯頁面的代碼全部刪除,只留一個Action,訪問此Action成功!
接着再把代碼全部恢復訪問此Action失敗!
目測其中有一個Action有問題,然后仔細查閱了一下代碼,跟其它頁面對比對比,找出最有可能出錯的一個方法,把這個方法注釋掉,再測試,訪問成功!
再恢復方法中的部分代碼再測試,訪問失敗!就這樣來回測試,最后定位到其中的一句代碼:
$_result_txt.= self::updateOrderExcel($_child[0], $_child[1], $_child[2],&$users,&$vars);
這句代碼只要存在就報錯。但這句代碼根本就沒執行,再細找最后發現:&$users,&$vars 這2個變量,如果把 & 去掉就好了。加上就不行。猜測的原因可能是這里代碼解析出錯了,然后調用寫日志又失敗了。結果就報這個錯。
這里寫 & 符號是因為我要傳遞變量的引用,在方法里賦值,因為返回值只有一個,而我要在方法外得到2個值,只能用引用的方式。
最后改成另一種寫法就好了,在調用的時候不加 & 符號,而在定義的時候加&符號,效果是一樣的。
什么意思呢?舉個例子:
function a($p1,$p2){ $p2=333; return $p1+$p2; } a(22,&$p); //原本寫法是這樣的 ,在這里調用完a后$p的值為333,沒錯,但正因為這樣寫就出現上述錯誤。
最后將寫法改為:
function a($p1,&$p2){ $p2=333; return $p1+$p2; } a(22,$p); //這樣調用完a后$p的值也是333,而解決了上述問題
至於什么原因,我也不清楚。在Debug=true時兩種寫法都OK,但Debug=false時第一種寫法就會報錯!也許第一種寫法是PHP新語法吧,目前網上的資料都是第二種寫法,我上次無意中發現第一種寫法也可行於是就用了第一種寫法,沒想到會出現這種錯誤,哎。。。