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

以 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,

这样就可以了。

原文地址:https://www.cnblogs.com/liuwei-a/p/10197876.html