Thinkphp3源码分析(1)

ThinkPHP3.2 入口文件剖析
本文深入分析了ThinkPHP3.2版本的入口文件index.php,并探讨了其目录结构及安全性配置,对比了与其他框架入口文件的不同之处。

最近在用Thinphp做开发中,发现了一些不直观的问题,不容易找到问题发生的原因,于是决定读一遍Thinkphp3.2的源码,仔细研究一下具体功能的具体实现方法。(当然,现阶段用Thinphp3做项目开发已经不大适合了,现在有一些更优秀的框架,比如说Yii2,Laravel5,Thinphp5等,这些框架抽象程度更高,但是理解起来也不太容易,所以刚开始尝试研究源码,最好还是拿TP3入手)

(1):入口文件(index.php)

TP3中的入口文件直接放在了项目根目录之下,其他的框架一般都是习惯放置于项目根目录/public/目录下,最新的TP5框架也是将入口文件放置在项目根目录/public/目录下面。之所以采用这样的方式,是出自安全的考虑。如果将index.php文件直接暴露在项目根目录之下,就意味者外部请求者可以直接访问我们项目根目录之下的所有的文件,可以不经过我们设置的路由规则。而将index.php放置在项目根目录/public/目录下面以后,我们可以指定服务器的root指定为项目根目录/public/目录,那么这样,所有的访问都必须先访问项目根目录/public/目录下的文件,不能直接访问其他目录下面各个文件,这就将项目中可以暴露的文件降到最低。

举个例子:

TP3的目录结构如下:


再看看我们对nginx server的配置:

server{
          listen 80 ;
          server_name sunms.codefly.top;
          index index.html index.htm index.php;
          root /home/wwwroot/tp3/;
      }
复制代码

那么访问http://sunms.codefly.top的时候,nginx直接将请求指定到/home/wwwroot/tp3/目录下进行访问。如果恶意用户将请求改为http://sunms.codefly.top/ThinkPHP/…文件名,那么用户一样可以进行访问,这样就存在风险了。那么如果我们将index.php放到项目根目录/public/目录中,nginx server 中的root 指向/home/wwwroot/tp3/public/。如果恶意用户将请求改为http://sunms.codefly.top/ThinkPHP/…文件名,根本就找不到这个文件,这个请求就不会成功。

下面简单看一下,TP3的index.php的代码(我会尽量对代码做注释的,特别的会拿出来讲一下)

// 应用入口文件
//检测php的版本号 --- 大于5.3的才可以
if(version_compare(PHP_VERSION,'5.3.0','<'))  die('require PHP > 5.3.0 !');
/*
定义全局的常量对项目进行设置
*/
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG',true);
// 定义应用目录
define('APP_PATH','./Application/');
// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';复制代码

时间有限,先说到这里,下一次分析path/ThinkPHP/ThinkPHP.php文件

php大版主说分太高...就改了 版本: ThinkPHP_3.0RC2_Core 作者: selfimpr Blog: http://blog.youkuaiyun.com/lgg201 Mail: lgg860911@yahoo.com.cn 环境/工具: • php-5.3.5-fpm • nginx-1.0.14 • vim + vim.debugger • xdebug-2.2.0RC1 参考: • 模式: ThinkPHP_3.0_Full • 概念: ThinkPHP3.0完全开发手册 目的: 1. 熟悉ThinkPHP工作流程 2. 熟悉ThinkPHP提供的公共函数库 3. 熟悉ThinkPHP的Action, Model, View等封装 4. 了解ThinkPHP的ORM 5. 熟悉ThinkPHP的模板引擎和标签库 概要: 通过阅读ThinkPHP源代码熟悉基于其的MVC开发, 并了解MVC框架实现细节. 评价: 1. 文档鼓励跨模块调用, 增加了系统耦合度 2. 系统未设计统一出口, 导致系统可控性较差 3. 整体代码略显杂乱, 少量硬编码 代码问题: 1. redirect()函数中设计了中转页, 但未暴露相应编程接口 2. URL_CASE_INSENSITIVE表意不明确, 它的含意是使用C风格命名(下划线)还是使用Java风格命名(驼峰) 3. 系统函数中大量使用了静态变量缓存, 但是部分实现上存在读/写key不一致的bug, 比如A, D 4. U方法中将协议硬编码为http://, 不利于扩展 5. Db的工厂接口getInstance()会导致factory()被调用两次 6. 配置了读写分离(DB_RW_SEPARATE)和DB_MASTER_NUM(大于0)时, 存在bug导致master库之前的数据库不能被命中. 7. Db->add()方法中对_after_insert()回调的处理依赖last_insert_id, 对无自增id的表则无法处理 8. TagLibCx中compiler()方法对<literal>标签的处理, literal编号只有一位数字, 当模板中<literal>标签超过10个时, 导致模板无法展现. 涉及点: 1. 设计相关概念 2. 请求分发流程 3. 数据库抽象层 4. Mysql数据库驱动层 5. Model层基类 6. 视图层 7. 内建标签库 8. 少量公共函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值