首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从c++调用php-cgi

如何从c++调用php-cgi
EN

Stack Overflow用户
提问于 2012-07-16 04:17:54
回答 1查看 2.3K关注 0票数 2

所以我在写一个web服务器(我知道,世界需要另一个服务器!)我想通过CGI调用php。我有一个运行良好的CGI1.1实现,可以运行perl cgi脚本。

现在我想运行php。但是,当我的cgi模块调用php程序时,它会返回404。

我该怎么做呢?

详情如下:

我使用php5运行在ubuntu上。在我的web服务器中,我将cgi请求传递给一个处理程序,它将找到程序并使用sc ript作为参数调用它。下面是生成cgi进程的代码:

代码语言:javascript
复制
chdir( dir );
execve( argv[0], argv.data(), (char* const*) req.posixEnv() );

我正在运行的命令相当于:

代码语言:javascript
复制
/usr/bin/php5-cgi /home/rafael/webserver/data/cgi-bin/test.php

这意味着我已经将"dir“设置为:

代码语言:javascript
复制
/home/rafael/webserver/data/cgi-bin

cgi进程应该在该目录中运行。Argv是"/usr/bin/php5-cgi",argv.data()返回带以下元素的空终止数组:

代码语言:javascript
复制
/usr/bin/php5-cgi
/home/rafael/webserver/data/cgi-bin/test.php
NULL

process环境包含CGI环境,其中包含一个通常CGI环境变量的块。

当我从一个shell运行上面的命令时,也就是说,通过在shell中输入它,脚本会很好地运行,而php生成测试页面。当我从CGI调用它时,它返回:

代码语言:javascript
复制
Status: 404 Not Found
X-Powered-By: PHP/5.3.10-1ubuntu3.2
Content-type: text/html

No input file specified.

现在我或多或少知道发生了什么。PHP正在检测它是否在CLI或CGI模式下运行,并在每种模式下搜索以不同方式运行的脚本。在CGI模式下,可能使用CGI环境变量(如SCRIPT_FILENAME和DOCUMENT_ROOT )解析脚本名。我已经尝试了很多东西--这些变量的不同设置。但这些都不管用。

我所知道的是: PHP的整个生成和读取输出都是有效的。例如,如果我删除某些CGI变量,使它认为它在CLI模式下运行,那么它就能很好地工作--生成页面和所有内容。

我需要知道的是:

  1. 为php-cgi设置CGI环境变量以找到我的脚本的正确方法是什么?
  2. 从exec调用php脚本的正确方法是什么。我正在为每件事使用完全路径,以此来调试它。我更喜欢使用相对路径。

我能找到的所有文档都是关于在特定的web服务器上为cgi配置php的。我需要从编写服务器的人的角度来了解这一点。

@编辑:我有一个简单的示例,它消除了c++。我很肯定那部分工作正常。假设我创建了一个调用php的脚本,并试图在shell中模拟cgi调用约定。

这样做是可行的:

代码语言:javascript
复制
#export GATEWAY_INTERFACE="CGI/1.1"                                                                                             
export REDIRECT_STATUS=200
export SERVER_PROTOCOL="HTTP/1.1"
export DOCUMENT_ROOT="/home/rafael/web"
#export SCRIPT_FILENAME="cgi-bin/test.php"                                                                                      
export SCRIPT_NAME="cgi-bin/test.php"

/usr/bin/php5-cgi test.php

但这并不是:

代码语言:javascript
复制
export GATEWAY_INTERFACE="CGI/1.1"                                                                                             
export REDIRECT_STATUS=200
export SERVER_PROTOCOL="HTTP/1.1"
export DOCUMENT_ROOT="/home/rafael/web"
#export SCRIPT_FILENAME="cgi-bin/test.php"                                                                                      
export SCRIPT_NAME="cgi-bin/test.php"

/usr/bin/php5-cgi test.php

我认为DOCUMENT_ROOT、SCRIPT_FILENAME和SCRIPT_NAME的某些组合可能是可行的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-19 12:55:31

把事情搞砸的是在php.ini中设置“php.ini”。我把它拆开了:

代码语言:javascript
复制
doc_root =

现在cgi环境变量更像CGI规范所说的那样工作。例如:下面的事情现在起作用了:

代码语言:javascript
复制
export GATEWAY_INTERFACE="CGI/1.1"
export SERVER_PROTOCOL="HTTP/1.1"
export SCRIPT_FILENAME="/home/rafael/web/cgi-bin/test.php"
export SCRIPT_NAME="test.php"
export REDIRECT_STATUS="200"

/usr/bin/php5-cgi test.php
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11498031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档