## 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. 總結
想一想,為什么我們只需要在控制器中寫入代碼,網站就能如常地訪問呢?如果沒有使用入口文件,在讓控制器能夠使用之前,我們還得自己手動初始化框架。正是入口文件的存在讓框架的使用如此地方便。
- 簡介
- 架構分析
- 整體架構
- 入口文件
- 懶性加載
- tp5的類加載
- 請求分發
- 鉤子
- 模型
- 模型實現(一)
- 模型實現(二)
- 模型實現(三)
- 視圖
- 視圖
- 控制器
- 控制器
- 路由解析
- 響應解析
- 請求解析
- 模板
- 模板定位
- 布局
- 變量輸出
- 緩存
- 緩存實現
- 命令行
- 簡介
- think
- 其他
- 多語言實現
- 配置文件
- 錯誤異常控制
- 日志實現
- 調試解析
- 框架調試環境的搭配
- 安全
- TP的未來發展
- 自己實現一個框架
- 簡介
- 01_入口文件
- 02_請求分發
- 03_懶性加載
- 04_懶性加載_類映射
- 05_實現一個鉤子類
- 06_對錯誤和異常進行控制
- 07_為框架添加配置功能
- 框架與設計模式
- 01_工廠模式
- 02_原型模式
- 03_封裝類模式
- 04_觀察者模式
- 05_單例模式
- 05_算法抽象類模式
- 項目質量保證
- 01_測試框架的配置
- 02_thinkphp測試環境配置
- 03_數據庫測試
- 04_http測試