PHP 框架工作流程

PHP framework work flow

我对 php 框架如何与像 apache 这样的网络服务器一起工作感到困惑。现在,如果没有框架并且它使用的是经典 php,那么我理解它是如何工作的(如果请求 php 文件,php 解析器会执行它并且 returns 服务器的 htm)。

当使用像cakePHP 这样的框架时,我注意到无论客户端请求哪个url,根文件夹中的index.php 都会先执行。这怎么可能?如果我们使用纯 php 那么,只有我们请求的文件才会被执行。那么 cakePHP 如何让每个请求都通过 /index.php 文件呢?

CakePHP 和许多其他网站利用 mod_rewrite,这是一个 Apache 模块,“提供基于规则的重写引擎来即时重写请求的 URLs".

为此,Web 框架将使用定义了特定规则的 .htaccess 文件。这些规则,在您询问的情况下,将任何匹配特定模式的 URL 指向 real index.php 文件(这个文件可以命名为任何东西真的,但是 index.php 是一个很好的 "default" 名字)。

根据 CakePHP 的 URL Rewriting 大纲,基本规则定义为:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /path/to/cake/app
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

上面所做的是:

  1. 开启重写模块
  2. 设置两个条件重写当前URL

    一个。 仅当请求的文件不是真实目录时 (!-d)

    b。 仅当请求的文件不是真实文件时 (!-f)

  3. 将请求的完整内容 URL、(.*) 发送到 index.php

有时,您会看到 RewriteRule 行为:

RewriteRule ^(.*)$ index.php?url= [QSA,L]

这会将请求的 url 设置到 $_GET['url'] 参数中,而不是强制应用程序处理 $_SERVER['REQUEST_URI']。其他时候,会有很多重写规则,有的复杂,有的基础。

关于 mod_rewrite,在线和书籍中有很多很好的资源。查看 Introduction to URL Rewriting 中的一个(这是我已添加书签的,有很多很好的基本规则/格式)。

这很简单 (https://github.com/gilbitron/PIP)。 读取系统文件夹中的文件。 基本上是这样的:

所有请求都发送到索引文件(使用 mod_rewrite,或类似普通的 get 参数)。

索引文件包括配置文件和常量定义。

然后加载框架的主要 class。

主要class做一些配置,启动数据库连接等。

根据它的实现方式,可能有一个路由器,但也可能没有't.If有一个主要的class检查应该根据路由器中的请求加载哪个控制器.

然后主要 class 加载应该加载该特定请求的控制器。

PIP 不是那么好,主要 class 实际上不是 class 但你可以在其中找到要点。


您还可以阅读以下内容:

面向对象编程:http://php.net/manual/en/language.oop5.php

范围:http://php.net/manual/en/language.variables.scope.php

自动加载 classes: http://php.net/manual/en/language.oop5.autoload.php

你提到了

"I have noticed that no matter which url the client requests, the index.php in the root folder gets executed first."

这就是前端控制器的作用。你可以有一个带有框架的前端控制器,或者如果使用 .htaccess 文件从头开始编码。前端控制器使用 PHP functions/methods 启用页面呈现,例如 Lumen 中的 $app->get($uri, $callback);