使用SSI,我可以简单地将其包含在我的HTML文件中,并在页面上显示CGI脚本的输出:
<!--#include virtual="script.cgi"-->
现在我正在尝试做等效的,但它不是HTML文件,而是在PHP文件中。我整天都在研究这个问题,每个解决方案都给我以下问题。我会从每个我认为应该起作用的内容开始列出它们以及模糊不清......
1)<?php include("script.cgi"); ?>
结果:无执行。这只是打印出CGI文件的完整内容,就像它只是一个文本文件一样。
2)<?php virtual("script.cgi"); ?>
结果: Fatal error: Call to undefined function virtual() in test.php on line #
。
这让我感到困扰,因为我读到的一切都表明这是正确的方法。我不是PHP的专家,但virtual
怎么可能成为“未定义的函数”?它是listed in the official PHP docs对PHP版本5有效。
3)<?php exec("script.cgi"); ?>
结果:空白。什么都没有。
4)
<?php
$fd = fopen("script.cgi", "r");
fpassthru($fd);
?>
结果:无执行。这只是打印出CGI文件的完整内容,就像它只是一个文本文件一样。
5)<?php echo system("script.cgi"); ?>
结果:混合。它执行但CGI脚本的“结果”打印两次,其前面是“Content-type:text / html”。我不明白。
Content-type: text/html resultresult
删除echo
...
<?php system("script.cgi"); ?>
,结果是......
Content-type: text/html result
6)<?php print("/usr/bin/perl script.cgi"); ?>
结果:无执行。它只是打印出print语句(/usr/bin/perl script.cgi
)之后包含的内容。 (我并不感到惊讶,但在论坛中有人声称这对他们有效。)
那么为了执行和包含CGI文件的结果,我需要做什么?这似乎应该很容易,但我不知道还有什么可以尝试。
我在Apache / Linux服务器(cPanel)上有权编辑htaccess
文件。它正在运行PHP版本5.2.17。
是的,当我在浏览器中提取CGI文件时,它会执行并显示结果,因此我们知道服务器已配置为执行CGI文件。
答案 0 :(得分:1)
如果PHP作为Apache模块运行,则CGI变量在内部传递。在调用希望在环境中找到它们的CGI脚本之前,应先将其复制到那里。
然后,CGI脚本可能会在内容之前写入HTTP响应标头。似乎没有一种方法可以防止PHP显示标头。因此,脚本必须适当地处理脚本输出。
例如:
<?php
foreach($_SERVER as $key => $value)
putenv("$key=$value");
$rtc = 0;
$out = array();
$mycgi = "/full/path/to/my/script.cgi";
exec($mycgi, $out, $rtc);
$in_header = true;
foreach($out as $value)
{
if ($in_header)
{
if (strlen($value) == 0)
$in_header = false;
else
header($value);
}
else
{
echo "$value\n";
}
}
if ($rtc)
error_log("$mycgi rtc=$rtc", 0);
?>
答案 1 :(得分:0)
尝试
passthru("/usr/bin/perl /full/path/script.cgi");
答案 2 :(得分:0)
system("/usr/bin/perl /full/path/to/cgi-bin/script.cgi");
答案 3 :(得分:0)
我已经尝试了一切,似乎没有任何工作正常或根本没有。因此,对我来说,唯一的答案是不能或不应该完成。此外,将CGI / Perl与PHP混合可能不是最佳实践。
简单地将任何小的CGI / Perl脚本重写为PHP应该不会太困难。任何太大而无法重写的东西,只要在整个网站上坚持使用Perl就是最好的。
答案 4 :(得分:0)
如何像apache2一样执行CGI会执行它吗?
我经常在PHP5中包装二进制CGI而没有任何问题。
您需要通过在exec()之前放置一些putenv()指令来模拟Web服务器调用,并使用带有3个给定参数的exec()(以便检查0的返回值)。
putenv()可用于建立与apache2提供CGI相同的环境 - 它也适用于传递URL参数。
如果有人可以选择用一种语言写作,那肯定会更好 -
但有一个场景需要接口 - 是否需要创建I / O包装器。
如果你不能以这种方式成功 - 如果你用cURL调用cgi, apache2将通过调用创建所需的环境。 这可能比需要的更复杂 - 更有点万不得已。
对不起,我不能提供一个例子,可能足够公平地告诉它是如何运作的。
正在寻找一种从CGI执行PHP的方法,反过来说:)
答案 5 :(得分:0)
<?php
$cgi = exec_cgi("path to cgi");
$cgi->addParameter->contentType("typeofcode");
?>
答案 6 :(得分:0)
为我工作
<?
echo "sometextadd".shell_exec( "/dirtofile/filecontaincgi.cgi | {
#commandinssh as sed 's/.*$/&<\/TR><TD>/' | and other
}")."sometextadd";
?>
答案 7 :(得分:-2)
我从这里得到了以下适合我的解决方案:link
为了方便而转储代码:
<?php
$data = file_get_contents("http://fullpathto.cgi",0);
echo $data;
?>
安装程序是在zend server + unix box上运行的C ++编译的.cgi模块