3

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ば「未定義の関数」になることができますか?これは、公式のPHPドキュメントにPHPバージョン5で有効であると記載されています。


3) <?php exec("script.cgi"); ?>

結果: 空白。何もない。


4)

<?php
    $fd = fopen("script.cgi", "r");
    fpassthru($fd);
?>

結果: 実行されません。これにより、CGIファイルのコンテンツ全体が単なるテキストファイルであるかのように出力されます。


5)<?php echo system("script.cgi"); ?>

結果: 混合。実行されますが、CGIスクリプトの「結果」が2回出力され、その前に「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ファイルを実行するように構成されていることがわかります。

4

7 に答える 7

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);
?>
于 2020-11-08T13:20:24.283 に答える
0

試す

passthru("/usr/bin/perl /full/path/script.cgi");
于 2012-05-08T23:51:02.697 に答える
0

私はすべてを試しましたが、何も正しく機能していないようです。したがって、私にとって唯一の答えは、それができない、または行われるべきではないということです。さらに、CGI/PerlをPHPと混合することはおそらくベストプラクティスではありません。

小さなCGI/PerlスクリプトをPHPに単純に書き直すのはそれほど難しいことではありません。大きすぎて書き直せない場合は、サイト全体でPerlを使用するのが最適です。

于 2012-12-21T22:42:41.560 に答える
0

apache2が実行するのと同じようにCGIを実行してみませんか?

私は常にバイナリCGIをPHP5で問題なくラップしています。

exec()の前にいくつかのputenv()命令を配置し、(0の戻り値をチェックするために)3つの指定されたパラメーターでexec()を使用することにより、Webサーバー呼び出しをシミュレートする必要があります。

putenv()を使用して、apache2がCGIを提供するのとまったく同じ環境を確立できます。これは、URLパラメーターの受け渡しにも適しています。

1つの言語で書くオプションがある場合は、常に確実に優れています-

ただし、インターフェイスが必要なシナリオがあります。I/Oラッパーを作成するだけでよいのです。

この方法で成功できない場合-cURLを使用してcgiを呼び出す場合、apache2は呼び出しによって必要な環境を作成します。これはおそらく必要以上に複雑です-ちょっと最後の手段です。

申し訳ありませんが、例を示すことはできません。おそらく、それがどのように機能するかを説明するのに十分公平です。

むしろ、CGIからPHPを実行する方法を探していました。その逆です:)

于 2013-01-25T04:06:01.803 に答える
0
<?php
$cgi = exec_cgi("path to cgi");
$cgi->addParameter->contentType("typeofcode");
?>
于 2014-03-12T16:09:18.560 に答える
0

私のためにこれを働きます

<?
echo "sometextadd".shell_exec( "/dirtofile/filecontaincgi.cgi  | {

#commandinssh as sed 's/.*$/&<\/TR><TD>/' | and other

}")."sometextadd";

?>
于 2019-02-13T18:07:20.793 に答える
-2

私はここから私のために働く次の解決策を得ました:リンク

便利なコードのダンプ:

    <?php
    $data = file_get_contents("http://fullpathto.cgi",0);
    echo $data;
    ?>

セットアップは、zendサーバー+UNIXボックスで実行されるC++コンパイル済み.cgiモジュールです。

于 2013-07-10T07:24:49.503 に答える