ホームページ >php教程 >php手册 >PHP で Web 経由で C/C++ アプリケーションを実行する

PHP で Web 経由で C/C++ アプリケーションを実行する

WBOY
WBOYオリジナル
2016-06-21 09:15:29941ブラウズ

c++|web|プログラム|実行

1. はじめに

Unix/Linux についてある程度の知識がある場合、それらのほとんどには C と C++ 用の独自のコンパイラ (それぞれ GCC と G++) が付属していることを知っているはずです。 Unix では、プログラムのインストールや Make など、さまざまな場所でこれらのコンパイラが使用されます。いくつかのコンソール コマンド、C++ および PHP を使用して、PHP プログラムで実行できる完全な C++ プログラムの例を生成し、対応する出力結果を取得する方法を示します。まず C++ プログラム コードを生成してコンパイルし、次に PHP 関数 passthru を使用してこのプログラムを実行する方法について説明します。ある意味、この記事は、Web ページを通じて一般的なプログラムにアクセスする方法を提供します。

この記事をよりよく理解するには、Apache と最新バージョンの php を実行している UNIX/Linux サーバーが必要です。同時に、C++ と UNIX コンソール コマンドも習得する必要があります。もちろん、PHP プログラミングの経験も必要です。

2. C++ プログラムを作成します

たとえば、コマンド ラインからパラメータを受け取ることもできる単純な C++ プログラムを作成し、それに Sampleapp という名前を付け、次の方法で 3 つの異なるパラメータをそれに渡すことができます。
Sampleapp ?パラメータ 1?パラメータ 2?パラメータ 3

このプログラムの機能は、渡されたパラメータの数と各パラメータの値を出力することであり、その後、コンパイルされた C++ プログラムを実行するために PHP スクリプト プログラムを使用できます。 。

お気に入りのテキスト エディタを使用して、Sampleapp.cpp という名前の新しいファイルを作成し、このファイルに次のコードを入力します。

#include

int main(int argc, char* argv [])
{
cout < <<(argc-1==1?) ) <<<<

cout<<(argc-1==1?)<<< argc-1 == 1 ? "" : "s") << << for(int i = 1; i < argc; i++)
<< "[" <
return 0;
}
この C++ プログラムには、プログラムのエントリ ポイント main() が含まれています。 main() 関数は 2 つのパラメータを受け取ります: argc (コマンド ラインは、渡されるパラメータ) と argv (渡されるパラメータの実際の値を含む文字ポインタの配列)。これら 2 つのパラメータは、C++ コンパイラによって自動的にキャプチャされます。

cout < <<(argc-1==1?) << "." << endl;;
この文は実行コマンドラインから渡されたパラメータの数を取得することを意味します。文字ポインター配列 Argv は 0 から取得されます。これには、少なくとも 1 つの実際の値 (つまり、このプログラムのパスと名前) が含まれます。この値は、C++ コンパイラーによって自動的に追加されます。条件演算子「?」は、コマンド ラインから複数のパラメーターが渡されるかどうかを判断するために使用されます。たとえば、コマンド ラインから 2 つのパラメーターが渡された場合、プログラムは次の情報を出力します:

あなたは 2 つの引数を渡しました。 ")
<< " 議論 " << (argc-1 == 1 ? "" : "s") << " "
<< (argc-1 == 1 ? " です) " : "are") << ": " << endl << endl;
次に、同じく条件演算子を使って別の文を出力します。ただし、プログラム実行コマンド ラインからパラメータを渡さなくても、main 関数の argv[] パラメータには値が含まれることに注意してください。同様に、コマンドラインからプログラムに 2 つのパラメータを渡すと、プログラムは次の情報を出力します:

これらの引数は:

for(int i = 1; i < argc; i++)
cout << ; "[" << i << "] " << argv[i] << endl; 最後に、main 関数はコマンドラインから渡された各パラメーターを 1 つずつ出力します。この関数は単純な for(;;) ループ文を使用して、パラメータの数に応じてパラメータ値を 1 つずつ出力できます。プログラムに「first」と「second」という 2 つのパラメータを渡すと、for ループによって出力される結果は次のようになります。

[1] ?first
[2] ?second

以上がこの C++ の簡単な説明です。プログラムとその関数 これは非常に簡単で、関数 cout を使用して、コマンド ラインで渡されたパラメーターを出力画面に表示するだけです。次に、この .cpp ファイルをコンパイルします。Windows プラットフォームを使用している場合は、使用しているサーバーに Telnet 接続する必要があります。ここでは、ほとんどの Unix マシンで提供されている G++ コンパイラを使用して、このソース ファイルをコンパイルします。ただし、マシンに G++ がインストールされていることを確認するには、次のコマンドを入力します。 G++ がすでにインストールされている場合、Unix シェルは G++ が存在する場所へのフルパスを表示します。インストールされていない場合は、「コマンドが見つかりませんでした」というメッセージが表示されます。G++ はここからダウンロードできます。

ソースファイルがあるディレクトリに次の G++ コマンドを入力します:

g++ -c sampleapp。 cpp.
パス このコマンドを使用すると、.cpp ファイルをマシンコードを含むターゲット ファイルにコンパイルします。 ls?a コマンドを使用すると、新しいファイルsampleapp.o がこのディレクトリに表示されることがわかります。これは、.cpp ソース ファイルがマシン コードにコンパイルされた結果です。ただし、最終的に必要なのは実行可能ファイルです。次の G++ コマンドも入力する必要があるためです:

g++ sampleapp.cpp ?o sampleapp
このようにして、sampleapp という名前の実行可能ファイルを取得します。ただし、Unix での実行可能ファイルは Windows とは異なり、拡張子がつかないことに注意してください。

これで、次のコマンドを与えると、プログラムの実行結果が確認できます:

sampleapp one -two /three
次の実行結果が確認できます:

3つの引数を渡しました。 [ 1] one
[2] ?two
[3] /three

実行可能な C++ プログラムが生成されたので、Web ブラウザーからこのプログラムにアクセスできる PHP チュートリアル プログラムを生成します。

3. PHP スクリプト プログラムを生成する

インターネット経由で C++ プログラムを呼び出すためには、PHP スクリプト プログラムを生成する必要があります。この PHP スクリプトにはフォームがあり、ユーザーが Sampleapp プログラムに渡すことができるパラメーターを入力できるようになります。 PHP スクリプトのコードは長すぎるため、ここではすべてをリストしません。必要に応じて、以下のアドレスからダウンロードできます。 (Phpコード)

if(@$submit)
{

}
else
{
}
まず、スクリプトプログラムは、変数$submitに値があるかどうかを確認します。プログラムの背後でフォームの送信が行われ、デフォルトでは null 値が設定されます。 @ 記号の機能は、変数 $submit の値が存在しない場合に、関連するエラー メッセージを無視することです。

変数 $submit はデフォルトでは空であるため、else{} 内のコードが最初に実行され、単にブラウザ上にフォームが表示されます。フォームの action 属性は変数 $PHP_SELF に設定されます。つまり、このページはフォームが送信された後に返されます。同時に、フォーム フォームにはテキスト入力バーが含まれており、ユーザーはこれを使用して、C++ プログラムに渡すコマンド ライン パラメーターを入力できます。フォームは以下の通りです:

実行コマンドを入力してフォームを送信すると、変数 $submit (Go ボタンの名前) に値が取得され、PHP 教科書では if{} の間のコードが実行されます。

if($args == "")
echo "

引数が入力されていません。

";
else
{
echo "

SampleApp Result

";
$command = "/htdocs/sampleapp " .escapeshellcmd($args);

passthru($command);
}
変数 $args は自動的に生成され、その値はテキスト入力バーから渡されます。フォームフォームの値。情報が入力されない場合、プログラムは単に値が入力されていないことをユーザーに通知します。

ユーザーが空ではない情報を入力すると、プログラムはテキスト フィールドの値である変数 $args を C++ プログラムに渡します。次のコードは、C++ プログラムを実行するための実行コマンドです:

$command = "/htdocs/sampleapp " .ecapeshellcmd($args);
関数 eacapeshellcmd は、「,」などの呼び出しをフィルタリングするためのセキュリティ チェック ツールとして使用されます。 、「」、「」、その他の特殊文字。これにより、一部のユーザーが特定の文字を入力して内部システム コマンドを呼び出すことができなくなります。

例えば、Formフォームのテキストフィールドに「1 ?two /three」と入力すると、変数$commandの値は、 /htdocs/sampleapp 1 ?two /three

ということがわかります。プログラムの定義。sampleapp 絶対パス。この例では、プログラム ファイルは /htdocs ディレクトリにあります。独自のプログラムが配置されているディレクトリに応じて、対応する変更を加えることができます。

passthru($command);

最後に、PHPの関数passthruを使って、変数$commandに含まれるコマンドを実行し、元の実行結果をブラウザに出力します。私のサーバーでは、結果を返す HTML ページは次のとおりです:

wこの記事を終える前に、遭遇する可能性のあるいくつかの問題についてお話したいと思います。まず、sampleapp.php チュートリアル プログラムを実行したときに、プログラムからの出力情報が表示されない場合は、セーフ モードがオンになっている可能性があります。その場合、システムは PHP スクリプトによるシステム内部プログラムの実行を許可しません。セーフ モードをオフにする方法については、Web ページ http://www.php.net/manual/en/features.safe-mode.php に詳細な説明が記載されています。次に、一部の Unix システムでは、PHP 関数 passthru が内部プログラムの出力を閲覧ページに渡すことができない場合、パススルー関数の代わりに system 関数を使用できます。

IV. 結論

この例からわかるように、Unix オペレーティング システムは非常に強力であり、PHP を使用すると、開発者はスクリプトを通じてシステム内部プログラムを独立したスレッドで実行できます。この記事で示した例は非常に単純ですが、もう少し努力することで、Mysql データベースを更新したり、他のシステム コマンドを実行したり、オペレーティング システムのファイル/ディレクトリ構造を操作したりできる C++ プログラムを作成できます。ただし、何があっても、システムのセキュリティを確保し、他のスクリプトが内部システム プログラムに自由にアクセスできないようにする必要があります。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。