Php 如何从c++;
所以我正在编写一个web服务器(我知道,就像世界需要另一个一样!),我想通过CGI调用php。我有一个很好的CGI1.1实现,足以运行perl cgi脚本 现在我想运行php。但是当我的cgi模块调用php程序时,它返回404 我怎样才能让它工作 详情如下: 我用php5在ubuntu上运行。在我的web服务器中,我将cgi请求传递给一个处理程序,该处理程序将找到该程序,并使用sc cript作为参数调用它。下面是生成cgi过程的代码:Php 如何从c++;,php,c++,web-services,web-applications,cgi,Php,C++,Web Services,Web Applications,Cgi,所以我正在编写一个web服务器(我知道,就像世界需要另一个一样!),我想通过CGI调用php。我有一个很好的CGI1.1实现,足以运行perl cgi脚本 现在我想运行php。但是当我的cgi模块调用php程序时,它返回404 我怎样才能让它工作 详情如下: 我用php5在ubuntu上运行。在我的web服务器中,我将cgi请求传递给一个处理程序,该处理程序将找到该程序,并使用sc cript作为参数调用它。下面是生成cgi过程的代码: chdir( dir ); execve( argv[0]
chdir( dir );
execve( argv[0], argv.data(), (char* const*) req.posixEnv() );
我正在运行的命令相当于:
/usr/bin/php5-cgi /home/rafael/webserver/data/cgi-bin/test.php
这意味着我已将“dir”设置为:
cgi进程应该在该目录中运行。Argv[0]是“/usr/bin/php5 cgi”,Argv.data()返回一个以null结尾的数组,其中包含以下元素:
/usr/bin/php5-cgi
/home/rafael/webserver/data/cgi-bin/test.php
NULL
流程环境包含CGI环境,其中包含一个通常CGI环境变量块
当我从一个shell运行上面的命令时,也就是说,在shell中输入命令,脚本运行良好,php生成测试页面。当我从CGI调用它时,它返回:
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模式下运行的,那么它工作得很好—生成页面和所有内容
我需要知道的是:
#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
但这并不是:
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
我认为文档根目录、脚本文件名和脚本名称的组合可能会起作用。搞乱它的是php.ini中“doc\u ROOT”的设置。我这样说:
doc_root =
现在cgi环境变量的工作方式更像cgi规范所说的。下面的事情现在起作用了:
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
搞乱它的是php.ini中“doc_root”的设置。我这样说:
doc_root =
现在cgi环境变量的工作方式更像cgi规范所说的。下面的事情现在起作用了:
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