## 1. 简述 在其他语言中(c/c++、java)通常都有一个函数(main)作为程序的入口函数。入口函数就是整个程序第一个执行的函数,之后系统会从入口函数一直执行到程序结束。 >入口函数(也称main函数):作为程序的入口,是程序执行的第一个函数。在入口函数中系统将控制权转交给用户程序,之后便开始执行用户程序代码。 而在PHP、JS这种脚本语言中,通常是没有入口函数的。程序的执行通常是从文件的第一行执行到最后一行,并不在是从入口函数的第一行代码执行到程序结束的。 类似的,我们把请求的生命周期比喻成程序的生命周期。当一个请求被发起,必须执行某个文件并且这个文件是作为每一个请求第一个执行的文件,这个文件便叫做入口文件。入口文件相当于入口函数。 ## 2. 例子 为什么需要入口文件呢?请看下面的需求。 需求:在网站的目录下有test1.php和test2.php文件,它们分别输出一段文字。用户可以访问这两个文件,如何在用户访问这两个文件的时候,将访问的文件写入到日志中?当有一万个这种文件,又该如何办? *test1.php* ~~~ <?php echo 'test1.php'; ?> ~~~ *test2.php* ~~~ <? echo 'test2.php'; ?> ~~~ 跟监控系统一样,我们或许可以在访问文件的时候埋一个点,比如: *test1.php* ~~~ <?php //这里埋一个点,写入test1.php到日志中 echo 'test1.php'; ?> ~~~ 类似的,test2.php也做同样的处理: *test2.php* ~~~ <?php //这里埋一个点,写入test2.php到日志中 echo 'test2.php'; ?> ~~~ 这样实现的确是能够达到我们所要求的功能,但是当我们有一万个test文件的时候又该怎么办呢?或许有同学说使用自动埋点技术,虽然是可以的。但是自动埋点技术实现起来比较复杂,有没有另外一种更加简单的方法呢? ## 3. 入口文件 我们可以使用一个php文件作为请求访问的第一个文件,再将请求转发到不同的test文件,然后在第一个文件中记录我们所请求的路径到日志中,便可以实现我们的需求了。 根据上面的例子,我们可以得知入口文件的最好的好处就是可以控制入口。这个就好比长城一样,长城修建地那么长只开放了其中几处隘口。长城外的人想要交易就只能在隘口内交易,隘口的经济控制总比控制辽阔的疆土经济容易得多吧。 就像上面的例子,用户每发起一个请求就相当于城外的人想要进来交易。入口文件将访问哪一个文件给记录到日志中就相当于城外的人进城门的时候登记一下要进来干什么事。非法的访问入口文件就拦截住不让其继续访问,相当于城口外面发现这个人是敌军的人直接抓起来。 在ThinkPHP5中,入口文件就是public目录下的index.php文件。还记得我们每次访问都得`index.php/模块/控制器/动作`吗。比如: `http://127.0.0.1/index.php/home/index/index`。 这是因为我们这样子访问的时候,每次都会先执行index.php这个文件。这个index.php便是我们上面所说的入口文件了。好处是: * 统一入口,方便控制 * 屏蔽可执行文件,简单安全 ## 4. TP 5.0的入口文件 *index.php* ~~~ <?php // [ 应用入口文件 ] // 定义应用目录 define('APP_PATH', __DIR__ . '/../application/'); // 加载框架引导文件 require __DIR__ . '/../thinkphp/start.php'; ~~~ ThinkPHP5的入口文件主要是定义APP_PATH和将start.php文件包含进来。 * 定义APP_PATH,这样子我们访问public目录的时候,就能够访问父目录下的application目录了。 * 加载框架引导文件,TP框架文件都是在这个时候被引入进来的。 ## 6. public的目录结构 将项目部署到服务器的时候,我们需要将网站的根目录设置到public目录下。这样的话,单单通过URL就无法访问到我们的项目代码中,这也算是一种比较好的目录架构。 以前一些比较老的框架,一般是将index.php放在框架的根目录中,在部署的时候直接将网站的根目录设置为框架的根目录。这样做,对于项目的代码是能够直接通过URL访问到的。这个时候,为了防止不安全的访问,通常会在项目的目录中防止空文件index.html。这种方式能够防止服务器软件不安全的设置而导致的目录文件可列举。并且还通常需要在可执行文件的首部,添加以下的代码来强制用户必须从入口文件中进入才能访问本文件: ``` <?php defined('入口文件中定义的常量,在这里检查') OR exit('没权访问,老哥'); //接着才是项目的代码 ``` 总结起来,框架添加public目录作为网站的根目录有两个安全上的好处: 1. 不用添加空的index.html文件 2. 防止通过URL能直接访问可执行文件。 ## 5. 总结 想一想,为什么我们只需要在控制器中写入代码,网站就能如常地访问呢?如果没有使用入口文件,在让控制器能够使用之前,我们还得自己手动初始化框架。正是入口文件的存在让框架的使用如此地方便。