这个项目其实包括了2个(也许会有更多)虚拟主机,一个用来展示静态页的,另一个就是管理后台了。
简单思考一下就可以知道,重构的目标其实就是把静态的虚拟主机转到这个管理后台的虚拟主机上来,把发布静态页的流程,变成正常的浏览。
考虑清楚这一点之后,就明确了寻找切入点的方法: 搞清楚管理后台的程序流程,重点是用于发布的分类方法,数据管理方法和发布过程的控制。
——— 下午茶时间的分割线 ———-
在本机开发环境下迅速就出现了问题: 登录不进去,看看代码涉及到了2个库,一个是用来存数据的,另一个使用存用户及登录日志等相关信息的。按照重构原则,我第一反应是保持数据库结构不变,理清代码之后再考虑如何重构数据,但是我迅速就发现,这个用户库结构非常简单,就直接把相关表合并到了产品数据的库中。修改数据库连接参数,顺利通过。
——— 洗茶杯的分割线 ———-
登录成功之后,直接就面对了左右2帧的错误页。打开代码,首先看到的是2个define:
define("SERVER_ROOT", "/home/xxx/projects...."); // 我该过了内容 define("HTTP_ROOT", 'http://'.$_SERVER['HTTP_HOST']."");
没二话,改为统一包含项目根下的 config.php, 并把这两个define移过去并合并就是了。
继续顺着把这套系统在本机跑起来的指导思想继续挖掘,很快,又看到了极度让人无语的代码(最前面2行注释不是我写的):
# 某某添加 false && 原来的这个权限控制真是恶心到家了 # 我想抽死他 if(false && (!function_exists("admin_confirm"))){ }else{ define("ALLOW_IP",'124.193.148.2'); $S_uid=$_COOKIE['S_uid']; $S_checkcode=$_COOKIE['S_checkcode']; $S_power_limit=$_COOKIE['S_power_limit']; function admin_confirm(){ global $DB_Power,$admin_confirm_setup; //... 省略若干代码 $HTTP_HOST=$_SERVER['HTTP_HOST']; $HTTP_HOST=str_replace('210.192.120.8:8089','xxx.xxxx.com.cn',$HTTP_HOST); $baseurl="http://".$HTTP_HOST.$_SERVER['PHP_SELF']; $url="http://".$HTTP_HOST.$_SERVER['REQUEST_URI']; $sql="select oppower.op_id from oppower,op where user_id='$S_uid' and url='$baseurl' and op.id=oppower.op_id"; //... 省略若干代码 } // 省略若干代码 admin_confirm(); }
真无语了。短短的80行代码,犯了很多种错误:
- 被废弃的函数,应该拿掉,即使当时为了安全注释掉了,也要在后续的修改中去掉,可以大大减轻持续修改的负担。
- define怎么也不该放到条件分支里面来写,很容易看不到的,而且这种看起来是做IP限定的代码,更要提出来,放到全局的配置文件中。否则一旦代码迁移,服务器搬迁,公司搬家等,后果不堪设想。
- 函数的定义不因该写到这样的一个if的分支内
- 中间一段,用str_replace的代码,明显是把一些配置写成了代码,这种问题,一旦遇到切换频道或者任何一种改变,估计程序都不知道上哪找毛病去
解决办法: define提出到全局配置文件,确认去掉那个老版本的的函数,然后去掉if判断,确认str_replace的目的,确定简化逻辑或者直接去掉这段逻辑代码。
与实际情况的差别: 这个文件中只保留的这个函数的定义,相关的调用挪到了包含这个函数的入口页面里,这样入口页面的逻辑就跟着变得清晰了一点。
– 待续 –
无评论