【问题标题】:How does PHP interface with Apache?PHP 如何与 Apache 交互?
【发布时间】:2011-02-15 21:00:48
【问题描述】:

我几乎已经在 J​​ava 下编写了一个兼容 HTTP/1.0 的 Web 服务器(没有商业用途,这只是为了好玩),基本上我想包括 PHP 支持。我意识到这根本不是一件容易的事,但我认为这将是一个不错的成就。​​

所以我想知道 PHP 是如何与 Apache Web 服务器(或任何其他 Web 服务器真正地)交互的,所以我可以从中学习并编写自己的 PHP 包装器。它不一定是 mod_php,我不介意编写一个 FastCGI 包装器 - 据我所知,它也能够运行 PHP。

我原以为 PHP 需要的只是发送到客户端的输出(因此它可以解释 PHP 部分)、来自客户端的完整 HTTP 请求(因此它可以提取 POST 变量等)以及客户端的主机姓名。然后您只需将解析后的 PHP 代码写入输出流。可能会有更多的东西,但本质上我认为它是这样工作的。

从我目前收集到的信息来看,apache2handler 提供了一个 API,PHP 使用它来“连接”到 Apache。我想看看 apache2handler 和 php5apache2.dll 的源代码是一个主意,但在我这样做之前,我想我会先问一下。

如果有人有更多信息、经验或与此相关的某种规范,请告诉我。

提前致谢!

【问题讨论】:

    标签: php apache interface


    【解决方案1】:

    简单地说,它是这样工作的:

    Apache 通常通过获取文件并将流发送到 HTTP 连接来提供文件。然而,使用 PHP,Apache 会获取文件,将其通过管道传输到 PHP 二进制文件中,然后将命令中的 输出 流发送到 HTTP 连接。

    【讨论】:

    • 这是一个好的开始,但是界面比这更复杂。不要忘记 PHP 具有在 Apache 发送内容之前修改 HTTP 标头等功能..
    • 这正是我在一个非常简单的层面上的想法,但我同意马特的观点。 PHP 做的远不止这些。现在我有一个 Parser 类,它可以在发送之前解析客户端输出和标题(此时它只是返回输出和标题而没有修改)。理想情况下,我想在这一点上集成 PHP。
    【解决方案2】:

    除了 php 文件、HTTP 请求和客户端主机名之外,还有某些其他信息项通常传递给 PHP 以设置 $_SERVER 超全局的某些其他元素。链接的文档页面列出了通常设置的内容。

    【讨论】:

    • 是的,我知道事实上它可能是 phpinfo() 的“Apache 环境”部分下的所有信息。
    • 嗯,我刚刚意识到 $_SERVER 有一个 argv 和 argc 变量,其中包含传递给解释器的参数。我想我会运行一个简单的 PHP 脚本并输出 argv 和 argc 内容,这可能会让我更好地了解 PHP 是如何被调用的。报废 - 空白输出 - Apache 不与 php.exe 外部联系,内部必须进行更多的工作,而不仅仅是查询 php.exe。
    【解决方案3】:

    关键字是CGI
    这是一个非常简单的协议,可以为 Web 服务器服务很长时间。
    它不是 PHP 与 Web 服务器交互的唯一方式,但最常见且易于实现的方式。

    简而言之,你的服务器必须设置一些环境变量,然后调用一个cgi-script,它本身就是一个php脚本。

    【讨论】:

      【解决方案4】:

      可以通过 3 种方式从 Apache 调用 PHP:

      1) 作为一个模块 - 这涉及将 php 解释器与网络服务器发布的挂钩库链接

      2) CGI - 网络服务器为每个请求启动一个解释器实例,并通过标准输入、命令行和环境变量将参数传递给解释器,stdout 被发送到客户端,stderr 应该被写入 error_log

      3) fastCGI - 这消除了为每个请求启动新进程的开销 - 解释器作为守护进程运行

      CGI 是最简单的实现,但不能很好地扩展/执行,该模块将是迄今为止最难的。 FastCGI 几乎与模块方法一样快。 CGI 和 fastCGI 是开放的、有据可查的 API。

      还有其他方法可以实现您的目标 - 例如Quercus

      C.

      【讨论】:

      • 啊哈,这很有意义。谢谢!我会调查一下。我可能只是尝试让 CGI 方法工作,然后像前几天查看他们的规范一样查看 FastCGI,但发现它非常混乱,也许我看错了地方。
      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 2017-02-12
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多