PHP如何与Apache交互?

How does PHP interface with Apache?

提问人:Waleed Amjad 提问时间:5/5/2010 更新时间:5/5/2010 访问量:15920

问:

我几乎已经完成了在 Java 下编写一个兼容 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之类的源代码是一个想法,但在我这样做之前,我想我会先问SO。

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

提前致谢!

PHP Apache 接口

评论


答:

6赞 Delan Azabani 5/5/2010 #1

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

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

评论

1赞 Matt 5/5/2010
这是一个好的开始,但界面比这更复杂。别忘了PHP具有在Apache发送内容之前修改HTTP标头的功能。
0赞 Waleed Amjad 5/5/2010
这正是我在一个非常简单的层面上的想法,但我同意马特的观点。PHP 的作用远不止于此。现在我有一个解析器类,它可以在发送前一刻解析客户端输出和标头(目前它只是返回输出和标头,无需修改)。理想情况下,我想在这一点上集成 PHP。
1赞 Amber 5/5/2010 #2

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

评论

0赞 Waleed Amjad 5/5/2010
是的,我知道实际上它可能是phpinfo(的“Apache 环境”部分下的所有信息)。
0赞 Waleed Amjad 5/5/2010
嗯,我刚刚意识到 $_SERVER 有一个 argv 和 argc 变量,其中包含传递给解释器的参数。我想我将运行一个简单的 PHP 脚本并输出 argv 和 argc 内容,这可能会让我更好地了解 PHP 是如何调用的。废弃 - 空白输出 - Apache 不外部联系 php.exe,内部必须有更多的事情发生,而不仅仅是查询 php.exe。
1赞 Your Common Sense 5/5/2010 #3

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

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

33赞 symcbean 5/5/2010 #4

有 3 种方法可以从 Apache 调用 PHP:

1) 作为一个模块 - 这涉及将 PHP 解释器链接到 Web 服务器发布的钩子库

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

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

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

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

C.

评论

0赞 Waleed Amjad 5/5/2010
啊哈,这很有道理。谢谢!我会调查的。我可能只是尝试让 CGI 方法工作,然后研究 FastCGI,因为我前几天确实看了他们的规范,但发现它非常令人困惑,也许我看错了地方。