最近在用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文件