【问题标题】:PHP framework work flowPHP框架工作流程
【发布时间】:2015-03-14 05:29:50
【问题描述】:

我对 php 框架如何与 apache 之类的 Web 服务器一起工作感到困惑。现在,如果没有框架并且使用的是经典 php,那么我了解它是如何工作的(如果请求了 php 文件,则 php 解析器执行它并将 htm 返回到服务器)。

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

【问题讨论】:

  • 你能解释一下你的意思吗?
  • 查看Introduction to URL Rewriting 以获得关于该主题的相当好的书面概述(它也可能回答您的很多问题)

标签: php cakephp frameworks


【解决方案1】:

CakePHP 和许多其他网站利用 mod_rewrite,这是一个 Apache 模块,“提供基于规则的重写引擎来动态重写请求的 URL”。

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

根据 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=$1 [QSA,L]

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

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

【讨论】:

    【解决方案2】:

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

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

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

    然后它为框架加载主类。

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

    根据它的实现方式,可能有一个路由器,但也有可能没有。如果有一个,主类检查应该根据路由器中的请求加载哪个控制器。

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

    PIP 不是很好,主类实际上不是一个类,但你可以从中理解。


    您还可以阅读以下内容:

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

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

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

    【讨论】:

      【解决方案3】:

      你提到

      “我注意到无论客户端请求哪个url,都会先执行根文件夹中的index.php。”

      这就是前端控制器所做的。您可以拥有一个带有框架的前端控制器,或者如果使用 .htaccess 文件从头开始编码。前端控制器支持使用 PHP 函数/方法渲染页面,例如 Lumen 中的$app-&gt;get($uri, $callback);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        • 2012-11-18
        • 2012-01-18
        • 1970-01-01
        • 2017-12-06
        相关资源
        最近更新 更多