【问题标题】:What renders the HTML?什么呈现 HTML?
【发布时间】:2011-05-31 22:00:00
【问题描述】:

在PHP中你可以写html和PHP,比如:

<html>
    <head>
        <?php echo "HTML Title from PHP "; ?>
    </head>
    <body>
        <h1>hello world!</h1>
    </body>
</html>

我想知道这是什么,它是如何工作的,写的是什么,我需要深入了解它吗?

现在我听说template engines,但也有很多template engines for PHP,所以(对我来说)在模板引擎上编写模板引擎听起来很愚蠢,正如我所理解的那样,模板引擎解析整个文件只是为了替换命令,然后它也开始输出文件内容,所以我觉得它不是系统的一部分,因此失去了性能。 (也许我完全错了,但说真的,这就是我听到它时的感受:P)

编辑

伙计们,当我说什么呈现 HTML 时,我的意思是什么在 PHP 中呈现 HTML?在 node.js 文件中,您不能编写任何 HTML,因为没有任何东西在处理它。

【问题讨论】:

  • 我真的不明白这里的问题是什么......
  • 我不太明白你的问题到底是什么?您展示的是一个非常好的 PHP 示例。使用成熟的模板引擎是有原因的,但这会很好——正如你所说,PHP 已经是一个模板引擎
  • 什么呈现 HTML?浏览器。
  • 是的...是的..但它是如何工作的?这是用 C++ 编写的核心功能吗?等等……
  • 在@BoltClock 的辩护中,你必须向某人解释“重点”才能错过它。

标签: php html rendering


【解决方案1】:

尽量避免提供太多信息,但这里是在 Linux 上与 Apache 一起使用时 PHP 的完整周期。

先决条件

一种常见的服务器设置称为 LAMP 堆栈,它代表 Linux、Apache、Mysql 和 PHP。通常,您可以找到数十种准备使用的 LAMP 堆栈设置以及使用它们的指南,因此在您的问题上下文中,您只需要关注 Apache 和 PHP。

第 1 阶段 - 授权

当网络浏览器通过 PHP 联系运行 Apache 的网络服务器时,Apache 的第一步是找到所需的内容。假设您访问 www.mywebsite.com/hello.php,Apache 会看到您正在寻找一个名为 hello.php 的文件。此时,由于后缀 (.php) ,Apache 知道该文件需要由 PHP 解释,因此它将处理委托给 PHP 解释器。

第 2 阶段 - 设置

从 Apache 到 PHP 的移交包括一系列标头,这些标头告诉 PHP 以下内容:正在处理的事务类型 (GET/POST/PUT/DELETE)、传入请求的 IP 地址、浏览器的用户代理(Firefox、MSIE、IPhone 等),如果有 cookie。更重要的是,Apache 将服务器上 hello.php 文件的路径交给 PHP。

第 3 阶段 - 处理

根据配置,PHP 可能需要做一些基本的内务管理(自行设置),但在理想条件下,它可以随时打开并打开 hello.php PHP 的一部分是一个名为 lexer 的模块,它查看 hello.php 和弄清楚如何处理文件。通过提供的示例,一个非常简单的示例可能如下所示:

  1. T_STRING = "\n\t\n\t"
  2. T_OPEN_TAG;
  3. T_ECHO;
  4. T_STRING = "来自 PHP 的 HTML 标题";
  5. T_CLOSE_TAG;
  6. T_STRING = "\t\n\t\n\t

    你好世界!

    \n\t\n"李>

请注意,大部分 T_ 代码都是我编造的,但它们与真实代码非常接近。

第 1 行 - PHP 知道它超出了所谓的范围,因此它立即将整个字符串传递给 Apache,即网络服务器。然后 Apache 很可能会将整个字符串传递到 Web 浏览器。

第 2 行 - T_OPEN_TAG 告诉 PHP 它正在进入 PHP 范围并等待它的第一条指令。

第 3 行 - T_ECHO 告诉 PHP 它将发出一个 echo 语句,因此它的规则然后开始寻找要输出的表达式或字符串。

第 4 行 - 幸运的是,下一个标记是一个字符串,所以 PHP 现在知道它会回显“来自 PHP 的 HTML 标题”

第 5 行 - ;告诉 PHP echo 语句是完整的,更重要的是这在语法上是正确的......所以 PHP 将字符串“HTML Title from PHP”交给 Apache,Apache 将其传递给浏览器。

第 6 行 - 关闭 ?> 标记告诉 PHP 它正在离开 PHP 语言范围,因此它回到了一组更简单的规则

第 7 行 - 与第 1 行一样,整个字符串被传递给 Apache 以传递给 Web 浏览器

此时,PHP 到达所谓的 EOF 或文件结尾,并且知道它已完成对文件 hello.php 的处理。它会进行清理工作,然后告诉 Apache 已完成。

完成

此时请求已基本完成,Apache 很可能会挂断网络浏览器,发送所有内容已完成的通知。

如果您有任何问题或需要任何关于下一步的指示,请告诉我。另请注意,为简洁起见,此处省略了很多细节,但只是为了了解 PHP 与 Web 浏览器和 Web 服务器的关系如何鸟瞰,这应该足以开始。

演示脚本

$test = 'Hello world <' . '?' . 'php echo \'this is in scope\'; ?' . '> and we\'re done';

 $tokens = token_get_all($test);

 print_r($tokens);

输出将是 PHP 生成的真实世界令牌字符串。每个令牌可以是字符串或三元素元组/数字数组,其中索引 0 == 令牌 ID,索引 1 == 原始字符串,我一生都记不住第三个元素是什么。如果您想知道每个令牌的名称是什么,请使用 token_name

【讨论】:

  • PHP 处理带外数据(打开/关闭标签之外的所有内容)的方式是 PHP 的最大优势之一,也是它的弱点。虽然 Ruby、C# 和 Node.JS 等其他语言需要模板层,但 PHP 是一种模板语言,它减少了初始设计要求。当然,当初级开发人员不受 PHP 或高级开发人员监督时,这会导致可憎的代码。只是不给 *uck (ex stackoverflow.com/questions/2658661/…)
【解决方案2】:

首先,PHP 是一个模板引擎,当您像在示例中一样使用它时。

如果你想保持简单,你真的不需要更多。

【讨论】:

  • 我不想保持简单,这就是我问这个问题的原因:)
  • 第一步是通过包含文件、函数和其他允许您从 html 中抽象出 php 的机制,将您的 php 代码从“视图”中分离出来。
【解决方案3】:

您的浏览器只是呈现 HTML 的东西。无论是通过 PHP、javascript 还是 asp 编写的,最终,能够确定文本含义(因为 html 只是文本)的是您的浏览器。

【讨论】:

    【解决方案4】:

    &lt;? ?&gt; 大括号内的任何内容都是 php 代码 - 它在服务器端执行,然后将纯 HTML 输出到客户端,此时客户端的 Web 浏览器会呈现它。

    看看这个diagram

    【讨论】:

    • 是的,非常好的图表,但我对 PHP 程序转到 Apache Web 服务器的部分感兴趣。神奇的是,我在 PHP 程序中编写的 HTML 会发生什么?
    • @CIRK 什么都没有。 HTML 由浏览器解释,并且发生在 Web 服务器解析页面之后。然后浏览器会看到 php 生成的 html 并对其进行相同的处理(就好像它从未发生过一样)。
    【解决方案5】:

    渲染的最终产品由您的网络浏览器处理。 (FF 是用 C/C++ 编写的)

    在传输之前,apache通过用C编写的PHP(预处理器)运行所有的php脚本

    如果您使用 PHP 本身编写的 PHP 模板引擎(例如:Smarty

    如果您真的关心性能,请切换到另一种语言。 PHP 模板引擎不是为了节省 CPU 周期甚至速度,而是提高生产力和可维护性,此外,它们使前端开发人员能够在不了解 PHP 的情况下维护更复杂的模板,这增加了他们的工作价值,同时免费开发人员进行更认真的编码。

    【讨论】:

      【解决方案6】:

      嗯,你需要了解 Web 开发的历史 为您的问题提供“答案”。

      在 199 年代 Web 开发开始时,很多人使用 珀尔。这些天你经常写这样的代码:

      print "<html>";
      print "    <head>";
      print "    <title>", get_site_name(), "</title>";
      print "    </head>";
      print "<body>Hello, World!</body>";
      print "</html>";
      

      正如你在这个例子中看到的,在这些日子里,你经常结束 写了很多 HTML,只包含一些小的动态内容。 像计数器、显示时间的时钟或其他小东西 事物。在这些日子里,PHP 的诞生就是为了使这个过程变得很多 更轻松。而不是编写打印大量 HTML 的代码, PHP 曾经/现在是一个模板引擎,它允许您编写 HTML 并仅包含您的代码。在这些日子里,你可能 最终编写 90% 的 HTML 和 10% 的逻辑。在这些日子里, 这通常是您需要的一切,而且容易得多 这边。

      但是时间变了。如今,Web 开发变得更加复杂 和早期一样。今天你可能写了 90% 的逻辑 10% 的 HTML。今天几乎一切都得到 自动生成,来自数据库。因为 提的脸色,今天你经常写你的PHP 应用喜欢

      <?php
          echo "<html>";
          echo "<head>";
      echo "...";
      echo "</html>";
      ?>
      

      正如你所见,进化是倒退的。而且不是 和前几天有很大的不同。 PHP 程序 大多数以启动 php 标记并生成所有内容而告终 并像过去一样回响所有需要的东西 使用 Perl。

      但是,这还不够,你从开始的地方结束。因为 今天你有更多的逻辑要写在你的应用程序中, 将您的应用程序分成许多和平是一个好主意。 您将应用程序 intp 逻辑和应如何显示分开 你的数据。

      逻辑本身是用 PHP 编写的,但要显示 数据人倾向于使用其他模板引擎, 今天更现代,更好地满足需求。

      是的,有一个模板引擎似乎有点尴尬 提升为通用语言,其中模板化 引擎是写进去的,但就是这样。

      关于如何呈现 HTML 的问题,你有一个“php”解释器,通常直接嵌入在 Apache (mod_php) 中,它可以完成所有工作,但对于这个描述,已经存在更好的答案。

      【讨论】:

        猜你喜欢
        • 2021-01-22
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        • 2013-02-16
        • 2015-07-21
        • 2010-10-31
        • 2012-10-25
        • 1970-01-01
        相关资源
        最近更新 更多