2011-08-12 19 views
6

基本上,我试图弄清楚如何从“web服务器”调用PHP。从虚拟/定制“web服务器”调用PHP

我已阅读文档,但没有多大帮助。

据我所知,有三种方法来调用PHP:通过命令行(例如:php -f "/path/to/script.php"

  • 通过CGI
  • (??)/通过的FastCGI(???)通过网络服务器(例如:阿帕奇)
  • 模块

所以,让我们开始CGI。也许我只是盲目的,但规范并没有提到Web服务器如何将数据(标头&回调)传递给实现CGI的东西。 FastCGI的情况更糟。

接下来,我们有服务器特定的模块,我甚至不知道要搜索什么,因为所有线索都没有结果。

+1

你有没有考虑阅读的代码?在你的问题中所有这些东西都是开源的。 –

+0

@Dan我*现在正在尝试*。但是由于以下几个原因,证明很困难:**(1)**我找不到所有的代码**(2)**代码是用c/C++ **(3)**代码很老, /或凌乱。 – Christian

+0

@丹说谁?如果我想(或者FPC,我打算这么做),我可以在汇编程序或ADA中执行此操作。 – Christian

回答

7

调用CGI脚本非常简单。 PHP有一些特殊性,但你基本上只需要设置环境变量的列表,然后调用PHP,CGI方式:

setenv GATEWAY_INTERFACE="CGI/1.1" 
setenv SCRIPT_FILENAME=/path/to/script.php 
setenv QUERY_STRING="id=123&name=title&parm=333" 
setenv REQUEST_METHOD="GET" 
... 

exec /usr/bin/php-cgi 

他们大多是样板。 SCRIPT_FILENAME是如何将实际的php文件名传递给PHP解释器,而不是作为exec参数。 PHP的关键也是非标准变量REDIRECT_STATUS=200

对于GET请求,您只需要环境变量。对于POST请求,只需将HTTP请求主体作为stdin传递给执行的php-cgi二进制文件。返回的stdout是由不完整的HTTP标头,\ r \ n \ r \ n和页面主体组成的CGI响应。

(只是从内存中。也许有一些更多的陷阱。)

+0

OH。这解释了一切。 – Christian

+0

我面临这个问题,那么你需要显式地填充'PATH_INFO'和'SCRIPT_PATH'变量。详情请查看[我的问题](http://stackoverflow.com/questions/18962960) – Andrey

1

FastCGI的可能是最好的选择,因为它是如此明智地使用,它会给你的语言独立性(你可以在Ruby中下降后,例如)和它的well documentedlotsofexamples

如果您真的想要,您可以编写自己的Server API,但比实现FastCGI更复杂,并且有几个缺点。

我不会打扰所有直CGI,FastCGI存在的原因。

+0

好的,Web服务器如何使用PHP可执行文件执行IPC?本地(环回)连接? – Christian

+0

@Christian它可能位于不同的主机上(任意TCP/IP连接),或者位于unix管道的另一端。请阅读我所链接的规范,它很简单。 –

+0

睡了几个小时后,我会给它一个很好的看看。已经是凌晨2:30了:/ – Christian