不能在PHP文件中包含/执行CGI文件

时间:2012-05-08 23:35:40

标签: php parsing cgi execution

使用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文件。

8 个答案:

答案 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模块