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>
上面所做的是:
- 开启重写模块
设置两个条件重写当前URL
一个。 仅当请求的文件不是真实目录时 (!-d
)
b。 仅当请求的文件不是真实文件时 (!-f
)
- 将请求的完整内容 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);
。
我对 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>
上面所做的是:
- 开启重写模块
设置两个条件重写当前URL
一个。 仅当请求的文件不是真实目录时 (
!-d
)b。 仅当请求的文件不是真实文件时 (
!-f
)- 将请求的完整内容 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);
。