一次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是不是跨域之类的。