使用 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);
?>
https://stackoverflow.com/questions/10507979/