以 ThinkPhp 为例,理解 PHP 框架的入口
2018-12-29 19:55
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,
这样就可以了。