php - 无法在 PHP 文件中包含/执行 CGI 文件

标签 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"); ?>

结果:没有执行。它只是打印出打印语句 (/usr/bin/perl script.cgi) 之后包含的内容。 (我并不感到惊讶,但论坛中有人声称这对他们有用。)


那么我需要做什么才能执行并包含 CGI 文件的结果呢?这看起来应该很容易,但我不知道还能尝试什么。

我在 Apache/Linux 服务器 (cPanel) 上可以编辑 htaccess文件。它运行 PHP 5.2.17 版。

是的,当我在浏览器中打开 CGI 文件时,它会执行并显示结果,因此我们知道服务器已配置为执行 CGI 文件。

最佳答案

如果 PHP 作为 Apache 模块运行,则 CGI 变量在内部传递。在调用希望在环境中找到它们的 CGI 脚本之前,应该将它们复制到那里。

然后,CGI 脚本可能会在内容之前写入 HTTP 响应 header 。似乎没有办法阻止 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);
?>

关于php - 无法在 PHP 文件中包含/执行 CGI 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10507979/

相关文章:

PHP/MYSQL - 如何检测更新前列中的值是否仍然相同(codeigniter)

javascript - 如何使用 e4x 去除 namespace ?

带有 curl 的 php 解析器 xml

java - 运行 CGI Java 程序

php - 计算差异超过 2 天的情况

php - 设计日志系统

php - 如何关闭准备语句连接?这是对的? - PDO

objective-c - 将 "ff0000"之类的字符串转换为 objective-c 中的十六进制数

php - mod_php 和 cgi php 脚本有什么区别?

perl - 如何防止 CGI Perl 中用户 session 的 session 劫持?