Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从c++;_Php_C++_Web Services_Web Applications_Cgi - Fatal编程技术网

Php 如何从c++;

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]

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

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

我怎样才能让它工作

详情如下:

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

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模式下运行的,那么它工作得很好—生成页面和所有内容

我需要知道的是:

  • 为php CGI设置CGI环境变量以查找脚本的正确方法是什么
  • 从exec调用php脚本的正确方法是什么。我正在使用所有内容的完整路径来调试它。我更喜欢使用相对路径
  • 我能找到的所有文档都是关于在特定web服务器上为cgi配置php的。我需要从编写服务器的角度来了解这一点

    编辑:我有一个简单的例子,它消除了C++。我很确定这部分工作正常。假设我制作了一个调用php cgi的脚本,并尝试在shell中模拟cgi调用约定

    这项工作:

    #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