【问题标题】:Why PHP script is not workig in a web browser?为什么 PHP 脚本不能在 Web 浏览器中运行?
【发布时间】:2010-01-09 18:53:18
【问题描述】:

我们都在 StackOverflow 上看到了许多基于 PHP 像 Javascript 一样工作的想法的问题。该人显然不明白 PHP 是一个 Preproccessor 并且只在页面发出之前工作。

下面的代码就是一个明显的例子,当用户按下按钮时,runCommand() 不会运行。

<a href="<?php runCommand(); ?>">Click Me!</a>

就像在 Javascript 中一样

<a href="javascript:runCommand();">Click Me!</a>

我看到过很多这样的问题,这些问题来自新人,他们根本没有意识到 PHP 的“如何”工作。

我的问题是:哪里有很好的资源来解释 PHP 的工作原理?。

我希望能够将人们重定向到一个可以让他们走上正确轨道的页面,并知道作为一个预处理器意味着什么。

(这也让我偷懒,不用每次出现都写解释,但不要告诉任何人!)

如果您不知道哪个地方可以很好地描述这一点,请随时提供您自己的解释。

正如Carl Smotricz 所指出的,PHP 的一部分可以在浏览器之外使用。但我主要是在 Apache 环境中讨论用户请求一个网页,并期望得到一些东西,通常是 HTML。

【问题讨论】:

  • 区别比这简单。 PHP 在服务器端执行,JavaScript 在客户端执行。
  • PHP 还是预处理器?谷歌搜索预处理器或 PHP 将为您提供所需的内容。
  • @Christopher:是的,但初学者通常不明白这一点。
  • 我不想讽刺,但这里有一个解释 PHP 工作原理的好资源 --------------- --------------> php.net/manual/en

标签: php


【解决方案1】:

维基百科总是一个很好的信息资源。我建议:

Server-side scripting

对

Client-side scripting


还有维基百科has pictures:

【讨论】:

  • 补充(这是老式的“CGI”时代,但对某些人来说可能是一个很好的小学):garshol.priv.no/download/text/http-tut.html
  • 同样重要的是 DOM 中的 JS 是基于事件的,而不是 PHP 的批处理样式。这对于 JS 示例的工作原理同样重要,我很惊讶这里没有其他人对此发表评论。
  • @JAL PHP 不是基于事件的,因为 PHP 执行时没有要处理的事件。
【解决方案2】:

可能是您不了解 PHP 的工作原理。 PHP 是一个完整的语言解释器,完全可以在没有浏览器的情况下在 Web 服务器之外运行 PHP 脚本:在命令行上或在 IDE 或其他 GUI 环境中。

您所说的 PHP 预处理器只是一个 Apache 模块的函数,它调用 PHP 解释器来实现这个特定的有限目的。

【讨论】:

  • 我在使用 Web 服务器时涉及到的大多数问题。我在问题中指定了这一点。
  • 虽然这是真的,但 99.9% 的 PHP 讨论围绕着服务器端脚本展开。毕竟,服务器端脚本是 PHP 的设计目的。假设 PHP == 服务器端脚本默认是很实用的。
  • 我同意,预处理器部分在这一点上有些不合时宜,主要是在名称中使首字母缩略词起作用。
【解决方案3】:

PHP 代码在服务器端进行解释,只有 PHP 代码的输出会发送到客户端。

因此,如果请求 PHP 文件,Web 服务器会将 PHP 代码发送到 PHP 解释器,等待输出,然后将输出发送回客户端。

【讨论】:

  • 哦,我可以提供一个带有“代码隐藏”的 HTML 示例吗?我学习 asp.net、html 和后面的代码在不同的“页面”上:x
【解决方案4】:

简而言之,PHP 属于服务器,它通常会输出 HTML,但它不是为了那个(或者至少,不仅仅是为了那个)。 用户浏览器只“看到”在 php 完成它之后剩下的内容。

Javascript 属于客户端(又名浏览器):它通常处理通过解析 HTML 创建的 DOM,而 HTML(可能)是通过执行 PHP 生成的。 Javascript 在不同的浏览器中可以表现不同(写过 JS 脚本的人都知道跨浏览器的问题,你还记得 IE6 吗?) Javascript不能单独处理数据库;它必须依赖于服务器端语言(php,也许?;)(除非谈论 node.js)

顺便说一句,AJAX 可以作为一个很好的参考来了解 PHP 到底做什么以及 JS 做什么。

【讨论】:

    【解决方案5】:

    一个重要的区别是浏览器中的 JavaScript 是事件驱动的。例如,这就是为什么在页面加载时不会立即执行点击处理程序的原因。如果不是 dom 编程的事件驱动风格,javascript 也无法等待响应该点击。

    我真的不认为这就是术语“预处理器”的含义。客户端/服务器端的区别更重要。例如,您是否听说过任何其他服务器端语言在执行与 PHP 相同的任务时被称为预处理器?

    【讨论】:

      【解决方案6】:

      php 在典型的服务器端场景中响应 http 请求。浏览器读取此响应并负责呈现它并在客户端运行嵌入在响应中的任何其他动态脚本。这本质上就是那种场景下的分工。

      【讨论】:

        【解决方案7】:

        PHP 是服务器端脚本语言,这意味着所有 php 代码都在页面发送到客户端之前执行。因此,您将永远看不到

        <?php ... ?> 
        

        在页面源中。

        在高抽象级别... 您可以将 Web 服务器(硬件)视为四个不同部分的组件。网络服务器(软件,例如 Apache)、文件系统、数据库和 PHP 插件。

        因此,例如,当您向 Web 服务器发送页面请求(对于某些页面 .../example.php)时,Apache 将尝试在文件系统中查找该页面,如果该页面存在,他将调用 php 插件来执行所有

        <?php ... ?> 
        

        代码(当然包括数据库查询)。将该页面发送回客户端后,您可以通过 JavaScript 对页面进行操作,通过 CSS 对其进行设计...

        更多信息:https://www.youtube.com/watch?v=PemsuAfc7Jw

        【讨论】:

        【解决方案8】:

        PHP 脚本不能在 Web 浏览器中运行的原因是只是因为 Web 浏览器不支持 PHP(至少我不知道)。这个事实并不像人们想象的那么微不足道。

        这听起来可能令人不安,因此请查看 W3C 网站上的 HTML 规范 HTML 5 和 HTML 4.01(因为它有更详细的示例)。你能找到什么?脚本可以用 JavaScript 以外的语言编写!

        这是来自 HTML 4.01 文档的示例(标题为 Specifying the scripting language 的部分)。


        (...)

        这是一个更有趣的窗口处理程序:

        <SCRIPT type="text/javascript">
              function my_onload() {
                 . . .
              }
        
              var win = window.open("some/other/URI")
              if (win) win.onload = my_onload
        </SCRIPT>
        

        在 Tcl 中,这看起来像:

         <SCRIPT type="text/tcl">
             proc my_onload {} {
               . . .
             }
             set win [window open "some/other/URI"]
             if {$win != ""} {
                 $win onload my_onload
             }
         </SCRIPT>
        

        用 Tcl 编写的脚本完全没问题。在 HTML 中! PHP 呢? HTML5 documentation 说:

        如果每个用户代理都支持脚本语言 脚本块类型的组件是 ASCII 不区分大小写的 匹配一个 MIME 类型字符串中的相应组件 用户代理实现的脚本语言。 (...) 用户代理可能支持其他语言的其他 MIME 类型, 但不得支持列表中语言的其他 MIME 类型 多于。用户代理不需要支持列出的语言 以上。

        因此,它是否支持 PHP 仅取决于 Web 浏览器(用户代理)。以 W3C 为例,支持 PHP 的 Web 浏览器可能已经接受了这样的内容。

        <script type="text/php">
              function my_onload() {
                 . . .
              }
        
              $win = $window->open('some/other/URI');
              if ($win !== false)
                  $win->onload = 'my_onload';
        </script>
        

        所以,人们问这些问题的原因并不是他们不知道 PHP 是如何工作的。这是因为他们一般不了解网络技术。它们有时会失败,这需要了解应该执行什么、在哪里以及为什么要执行。

        【讨论】:

        • 问题不是网页浏览器不支持PHP,问题是PHP不支持网页浏览器。 PHP 设计为在服务器端执行,因此与客户端完全不同。
        • @user34660 根本不是真的。阅读我回答的最后一段。
        【解决方案9】:

        PHP 编译器 在服务器中作为 CGI 脚本执行。 CGI 脚本从标准输入读取并写入标准输出,类似于控制台或命令提示符程序。 PHP 编译器读取包含 HTML 和嵌入 PHP 的文件并将 HTML 写出,并且(当遇到时)执行 PHP 并写入 PHP 代码的结果。输出由服务器接收然后发送到客户端。

        见PHP: CGI and command line setups - Manual 说:

        By default, PHP is built as both a CLI and CGI program, which can be used for CGI processing.
        

        CLI 和 CGI​​ 之间的区别在这里并不重要。

        另见PHP: What is PHP? - Manual,上面写着:

        the code is executed on the server, generating HTML which is then sent to the client.
        

        见RFC 3875 - The Common Gateway Interface (CGI) Version 1.1。这是CGI的官方定义。 PHP 很少使用原始的 CGI 协议;使用其他协议(例如 FastCGI)并执行与原始 CGI 协议相同的功能,但旨在提高效率。为了了解 PHP 如何工作,原始 CGI 协议是相关的。以下是 RFC 的摘录。

        Abstract
        
        The Common Gateway Interface (CGI) is a simple interface for running
        external programs, software or gateways under an information server
        in a platform-independent manner.  Currently, the supported information
        servers are HTTP servers.
        

        【讨论】:

          猜你喜欢
          • 2014-09-06
          • 1970-01-01
          • 2022-01-10
          • 1970-01-01
          • 1970-01-01
          • 2017-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多