gpt4 book ai didi

php - 如何从 C++ 调用 php-cgi

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:59:27 26 4
gpt4 key购买 nike

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

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

我如何让它工作?

详情:

我在 ubuntu 上运行 php5。在我的 web 服务器中,我将 cgi 请求传递给一个处理程序,该处理程序将找到该程序并使用脚本作为参数调用它。所以这是生成 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”设置为:

/home/rafael/webserver/data/cgi-bin

并且 cgi 进程应该在该目录中运行。 argv[0] 是“/usr/bin/php5-cgi”,argv.data() 返回一个包含以下元素的空终止数组:

/usr/bin/php5-cgi
/home/rafael/webserver/data/cgi-bin/test.php
NULL

进程环境包含 CGI 环境,其中包含一 block 常用的 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 模式下运行,它会工作得很好——生成页面和所有内容。

我需要知道的是:

  1. 为 php-cgi 设置 CGI 环境变量以找到我的脚本的正确方法是什么。
  2. 从 exec 调用 php 脚本的正确方法是什么。我正在为所有内容使用完整路径来调试它。我更愿意使用相对路径。

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

@EDIT:我有一个更简单的例子,它消除了 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

我认为 DOCUMENT_ROOT、SCRIPT_FILENAME 和 SCRIPT_NAME 的某种组合应该可以工作。

最佳答案

搞砸的是 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

关于php - 如何从 C++ 调用 php-cgi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11498031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com