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 つの異なるパラメータを渡すことができます。
サンプルアプリ ?パラメータ 1 ?パラメータ 2 ?パラメータ 3
このプログラムの機能は、渡されたパラメーターの数と各パラメーターの値を出力することです。その後、PHP スクリプト プログラムを使用して、コンパイルされた C++ プログラムを実行できます。
お気に入りのテキスト エディタを使用して、Sampleapp.cpp という名前の新しいファイルを作成し、このファイルに次のコードを入力します。
#include int main(int argc, char* argv[]){
cout << (argc-1 == 1 ? "これ" : "これら")
|
以下は引用内容です:
cout < |
以下は引用内容です:
2 つの引数を渡しました。
cout << (argc-1 == 1 ? "これ" : "これら")
<
< | tr>
次に、条件演算子を使用して別の文を出力します。ただし、プログラム実行コマンド ラインからパラメータを渡さなくても、main 関数の argv[] パラメータには値が含まれることに注意してください。同様に、コマンドラインからプログラムに 2 つのパラメーターを渡すと、プログラムは次の情報を出力します:
これらの引数は次のとおりです: for(int i = 1; i cout << "[" << |
以下为引用的内容: You passed 3 arguments. These arguments are: [1] one [2] ?two [3] /three |
次の実行結果が表示されます:
以下は引用内容です: 3 つの引数を渡しました。
|
以下は引用内容です: if(@$submit){ } その他{ } |
まず、スクリプト プログラムは、変数 $submit に値があるかどうかを確認します。この変数 $submit の値は、プログラムの後半でフォーム フォームが送信された後に渡されます。デフォルトでは null 値が設定されます。 @ 記号の機能は、変数 $submit の値が存在しない場合に、関連するエラー メッセージを無視することです。
変数 $submit はデフォルトでは空であるため、else{} のコードが最初に実行され、単にブラウザ上にフォームが表示されます。フォームの action 属性は変数 $PHP_SELF に設定されます。つまり、このページはフォームが送信された後に返されます。同時に、フォーム フォームにはテキスト入力バーが含まれており、ユーザーはこれを使用して、C++ プログラムに渡すコマンド ライン パラメーターを入力できます。フォームは以下のとおりです。
実行コマンドを入力してフォームを送信すると、変数 $submit (Go ボタンの名前) が値を取得するため、PHP 教科書は if{} の間のコードを実行します。
if($args == "") エコー " 引数が入力されていません。 "; その他{ エコー " サンプルアプリの結果 "; $command = "/htdocs/sampleapp " .escapeshellcmd($args); パススルー($command); } |
変数 $args は自動的に生成され、その値はフォーム フォームのテキスト入力バーから渡された値です。情報が入力されない場合、プログラムは単に値が入力されていないことをユーザーに通知します。
ユーザーが空ではない情報を入力すると、プログラムはテキスト フィールドの値、変数 $args を C++ プログラムに渡します。次のコードは、C++ プログラムを実行するための実行コマンドです:
$command = "/htdocs/sampleapp " .escapeshellcmd($args); 関数 ecapeshellcmd は、「,」、「」、「」などの特殊文字を除外するためのセキュリティ チェック ツールとして使用されます。これにより、一部のユーザーが特定の文字を入力して内部システム コマンドを呼び出すことができなくなります。 たとえば、フォーム フォームのテキスト フィールドに「1 ?two /three」と入力すると、変数 $command の値は次のようになります: /htdocs/sampleapp 1 ?two /three この例では、プログラム sampleapp の完全なパスが定義されていることがわかります。このプログラム ファイルは /htdocs ディレクトリにあります。独自のプログラムが配置されているディレクトリに応じて、対応する変更を加えることができます。 パススルー($command); 最後に、PHP 関数 passthru を使用して変数 $command に含まれるコマンドを実行し、元の実行結果をブラウザに出力します。私のサーバーでは、結果を返す HTML ページは次のとおりです: wこの記事を終える前に、遭遇する可能性のあるいくつかの問題についてお話したいと思います。まず、sampleapp.php チュートリアル プログラムを実行したときに、プログラムからの出力情報が表示されない場合は、セーフ モードがオンになっている可能性があります。その場合、システムは PHP スクリプトによるシステム内部プログラムの実行を許可しません。セーフ モードをオフにする方法については、Web ページ http://www.php.net/manual/en/features.safe-mode.php に詳細な説明が記載されています。次に、一部の Unix システムでは、PHP 関数 passthru が内部プログラムの出力を閲覧ページに渡すことができない場合、パススルー関数の代わりに system 関数を使用できます。 4.結論 この例からわかるように、Unix オペレーティング システムは非常に強力であり、PHP を使用すると、開発者はスクリプトを通じて独立したスレッドでシステム内部プログラムを実行できます。この記事で示した例は非常に単純ですが、もう少し努力することで、Mysql データベースを更新したり、他のシステム コマンドを実行したり、オペレーティング システムのファイル/ディレクトリ構造を操作したりできる C++ プログラムを作成できます。ただし、何があっても、システムのセキュリティを確保し、他のスクリプトが内部システム プログラムに自由にアクセスできないようにする必要があります。