使用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文件。
尝试
passthru("/usr/bin/perl /full/path/script.cgi");
system("/usr/bin/perl /full/path/to/cgi-bin/script.cgi");
我已经尝试了一切,似乎没有任何工作正常或根本没有。因此,对我来说,唯一的答案是它不能或不应该这样做。此外,将CGI / Perl与PHP混合可能不是最佳实践。
简单地将任何小的CGI / Perl脚本重写为PHP应该不会太困难。任何太大而无法重写,然后在整个网站上坚持使用Perl将是最好的情况。
如何像apache2一样执行CGI会执行它?
我经常在PHP5中包装二进制CGI,没有任何问题。
您需要通过在exec()之前放置一些putenv()指令来模拟Web服务器调用,并使用带有3个给定参数的exec()(以便检查返回值为0)。
putenv()可用于建立与apache2提供CGI相同的环境 - 它也适用于传递URL参数。
如果一个人可以选择用一种语言写作总是更好 -
但是有一个场景需要接口 - 只需要创建I / O包装器。
如果你不能以这种方式成功 - 如果你用cURL调用cgi,apache2将通过调用创建所需的环境。这可能比需要的更复杂 - 更有点万不得已。
对不起,我不能提供一个例子,可能足够公平地告诉它是如何工作的。
而是寻找一种从CGI执行PHP的方法,反过来:)
<?php
$cgi = exec_cgi("path to cgi");
$cgi->addParameter->contentType("typeofcode");
?>
对我这样做
<?
echo "sometextadd".shell_exec( "/dirtofile/filecontaincgi.cgi | {
#commandinssh as sed 's/.*$/&<\/TR><TD>/' | and other
}")."sometextadd";
?>
我从这里得到了以下解决方案,对我有用:link
为方便起见,转储代码:
<?php
$data = file_get_contents("http://fullpathto.cgi",0);
echo $data;
?>
安装程序是在zend server + unix框上运行的C ++编译的.cgi模块