1. 程式人生 > >以 ThinkPhp 為例,理解 PHP 框架的入口

以 ThinkPhp 為例,理解 PHP 框架的入口

2018-12-29 19:55 以 ThinkPhp 為例,理解 PHP 框架的入口

以 ThinkPhp 為例,理解 PHP 框架的入口。

ThinkPhp 是用 PHP 語言寫的,它所影響到的範圍是 PHP 內部,ThinkPhp 必須先被載入起來,它才能工作,所以整體思路是獲得入口的載入機會,然後執行框架本身的功能,再調起在框架上開發的功能,例如,URL對應的程式碼。

ThinkPhp 需要外部做的事情是,對於需要 ThinkPhp 處理的頁面,呼叫 ThinkPhp 入口,入口的名字叫 index.php,將 URL 的資訊以引數的形式傳給 index.php。調起 index.php 是 PHP 本身的功能,index.php 跑起來,就有了 ThinkPhp,即,ThinkPhp 開始工作了。

如果沒有 ThinkPhp 這個框架,PHP 本身也可以實現各種功能。ThinkPhp 的 index.php,和其它的 php 檔案一樣,都是 php 檔案,可以和目錄中的其它 php 檔案並存。如果被調起的不是 ThinkPhp 的 index.php,這次呼叫就和 ThinkPhp 無關了。

環境中有這些角色:

  • nginx,
  • php-fpm,
  • php, 其中包括:
  • ThinkPhp
  • 其它 php

在沒有 ThinkPhp 的情況下,php 是這樣被調起來的:

客戶端以瀏覽器為例。瀏覽器將請求傳送給 nginx。

nginx 收到請求,按照配置檔案中的內容進行匹配,php 對應的規則被匹配上,執行規則下面的指令,指令的功能是將請求轉發給 php-fpm,轉發的內容包括:

  • 根目錄的位置,
  • 完整的 http 訊息(其中含有 url),等,

這些都是 nginx 在做。

php-fpm 收到請求之後,解析 url,結合根目錄,定位到 php 檔案,執行這個 php 檔案(php 是指令碼語言,是可以執行的),這個 php 檔案中有輸出內容的語句(例如,echo 語句),這些內容輸出到了 php-fpm 中。等 php 檔案執行結束,php-fpm 將這些內容放入到 http 響應訊息中,傳送給 nginx。

nginx 收到響應,將響應傳送給瀏覽器。

ThinkPhp 的調起方式是這樣的:

http://xxx/index.php?index&index

或者

http://xxx/index.php?index/index

注意:問號(?)作為引數的起始分隔符,不可改變,如果將問好(?)改為斜線(/),index.php 就不是要載入的 php 檔案了。

nginx 中的重寫功能,可以讓上面的 url 變得好看一點,例如:

http://xxx/index/index

nginx 的工作原理是“匹配規則 + 指令”,這裡規則可以是:

  • 不存在的 url,
  • 或其它規則

指令為:

將載入的頁面修改為 ThinkPhp 的 index.php,將 index/index 作為引數傳遞給這個頁面,即,將 url 修改為:

http://xxx/index.php?index/index

接下來,會匹配到 php 的通用規則,一般是:

  • 檔案帶有“.php”字尾

指令為:

  • 將請求轉發給 php-fpm,

這樣就可以了。