一次PHP代碼上線遇到的問題

exception ‘CDbException’ with message ‘The table “pms_goods” for active record class “PmsGoods” cannot be found in the database.’ in /data/work/admin/framework/db/ar/CActiveRecord.php:2385

上線之前,本地測試通過,把測試機代碼和Yii framework代碼一同下載下載,部署到本地Linux虛擬機中,也正常運行。

而測試服務器就遇到這個錯誤。
而我堅信 我用的只不過是Yii的 CActiveRecord 而已,代碼不會有問題,重寫了getDbConnection方法、和 tableName方法:
如下所示:Yii多數據庫 使用AR(ActiveRecord) ,
Stackoverflow 上說 把tableName下面的改成雙引號,但這並不是問題原因。

public function tableName()
{
    return 'pms_goods';
}

public function getDbConnection()
{
    return Yii::app()->pmsdb;
}
//調用方式,這還能錯?
 PmsGoods::model()->findAll($criteria);

經過stackoverflow 和 Google一番之後依舊沒有找到原因。

花了兩天時間艱難的調試,終於找到原因。
過程:
通過vi 直接在測試服務器上改代碼,第二天我打算換種SQL調用寫法,當我改成:

Yii::app()->pmsdb->CreateCommand($sql)->queryAll();

報錯的信息不一樣了,

exception ‘CDbException’ with message ‘CDbConnection failed to open the DB connection: SQLSTATE[HY000] [2002] Connection timed out’ in /data/work/admin/framework/db/CDbConnection.php:399

瞬間明白什麼問題了,服務器是連不上這個數據庫啊!!!!!
SO,在SecureCRT上直接 mysql -h xxx.com -u xxx -p xxx
連接一下看看,果然連不上。

總結:
一條錯誤信息也許指出的問題跟明確,但也可能是誤導,如果有其他方式可以做,雖然這樣會證明自己懷疑了當前寫法,但也許會有新的發現找到其他的問題。這個例子的關鍵就是:不是數據庫裏沒有這張表,而是數據庫根本就連不上。

Yii這個框架,使用簡單,但說實話,出了問題真的很難調試。

ps:測試人員 改配置文件的時候,文件裏多了 i (囧),以及,測試機器的php,他的設置沒有錯誤輸出,這兩點讓我昨天耗了一天。


2016.09.27
後面跟運維反應了一下,是因爲阿里雲數據庫遷移,導致DNS的問題。
具體的我不是很懂,重新配置了一下就可以訪問了。

總結:自己的代碼能跑,到別的地方就不能跑,一定是因爲環境的問題。首先要想到的就是數據庫,之類的網絡是不是不能訪問,應用的權限是不是沒配置, JS是不是跨域之類的。

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