我对php框架如何与apache这样的web服务器一起工作感到困惑。现在,如果没有框架,如果它使用经典的PHP,那么我理解它是如何工作的(如果请求php文件,php解析器执行它并将htm返回给服务器)。
当使用像cakePHP这样的框架时,我注意到无论客户端请求哪个URL,根文件夹中的index.php
都会先被执行。这怎么可能?如果我们使用的是纯PHP,那么只有我们请求的文件才会被执行。那么cakePHP如何使每个请求都通过/index.php
文件?
答案 0 :(得分:2)
CakePHP和许多其他网站利用mod_rewrite
这是一个Apache模块“提供基于规则的重写引擎来动态重写所请求的URL ”。
为此,Web框架将使用定义了特定规则的.htaccess
文件。在您询问的情况下,这些规则将与特定模式匹配的任何URL指向真实的 index.php
文件(此文件可以真正命名,但是{{1} }是一个很好的“默认”名称。)
根据CakePHP的URL Rewriting大纲,基本规则定义为:
index.php
以上是做什么的:
设置重写当前网址的两个条件
一个。如果请求的文件不是真实目录(<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>
)
湾仅如果请求的文件不是真实文件(!-d
)
!-f
发送到(.*)
有时,您会将index.php
行视为:
RewriteRule
这会将请求的网址设置为RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
参数,而不是强制应用程序处理$_GET['url']
。其他时候,会有很多重写规则,有些复杂,有些基本。
关于$_SERVER['REQUEST_URI']
,网上和书中都有很多好的资源。查看Introduction to URL Rewriting一个(我已经添加了书签,有很多好的基本规则/格式)。
答案 1 :(得分:0)
这是一个非常简单的(https://github.com/gilbitron/PIP)。 读取System文件夹中的文件。 基本上它是这样的:
所有请求都发送到索引文件(使用mod_rewrite,或者像普通的get参数一样)。
索引文件包含配置文件和常量定义。
然后它加载了framerwork的主类。
主类进行一些配置,启动数据库连接等等。
根据它的实现方式,可能有一个路由器,但它可能没有。如果有一个主类检查应该在路由器中对请求加载哪个控制器。
然后主类加载应该加载该特定请求的控制器。
PIP并不是那么好,主要类实际上不是一个类,但你可以明白它。
您还可以阅读以下内容:
面向对象编程:http://php.net/manual/en/language.oop5.php
答案 2 :(得分:0)
您提到
“我注意到无论客户端请求哪个url,都会首先执行根文件夹中的index.php。”
这是前端控制器的工作。您可以使用带有框架的前端控制器,也可以使用.htaccess文件从头开始进行编码。前端控制器可以使用PHP函数/方法(例如Lumen中的$app->get($uri, $callback);
)渲染页面。