【PHP8.x】system()関数の使い方
system関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
system関数は、外部プログラムを実行し、その出力を直接ブラウザに出力する関数です。この関数は、PHPスクリプトからOSのコマンドラインインタフェースを利用して、様々なシステムコマンドを実行するために使用されます。例えば、ファイルシステムの操作、ネットワーク関連の処理、プロセスの実行などが可能です。
system関数は、実行するコマンドを文字列として引数に取ります。この文字列は、そのままOSのシェルに渡されるため、セキュリティ上のリスクを考慮する必要があります。特に、ユーザーからの入力に基づいてコマンドを生成する場合、コマンドインジェクション攻撃を防ぐために、入力のサニタイズやエスケープ処理が不可欠です。
関数は、実行されたコマンドの終了ステータスを返します。終了ステータスは、コマンドが正常に完了したかどうかを示す数値で、通常は0が正常終了を意味します。エラーが発生した場合、0以外の値が返されます。この終了ステータスを利用することで、実行されたコマンドの結果をPHPスクリプト内で判断し、適切な処理を行うことができます。
system関数は、コマンドの実行結果を標準出力として直接ブラウザに出力するため、PHPスクリプトの出力を制御する必要があります。必要に応じて、出力バッファリングを利用したり、ob_start() や ob_end_clean() などの関数を使用して、出力を制御することができます。
注意点として、system関数はサーバー環境によっては利用が制限されている場合があります。php.ini ファイルの設定で disable_functions ディレクティブに system が指定されている場合、この関数は使用できません。セキュリティ上の理由から、system関数の使用を制限することは一般的なプラクティスです。代替手段として、proc_open 関数や exec 関数など、より柔軟で安全な方法で外部プログラムを実行することを検討すべきです。
構文(syntax)
1system ( string $command , int &$return_var = null ) : string
引数(parameters)
string $command, int &$result_code = null
- string $command: 実行したいシステムコマンドを文字列で指定します。
- int &$result_code = null: コマンド実行結果の終了コードを格納する変数への参照です。省略可能です。
戻り値(return)
string|false
system() 関数の戻り値は、実行されたコマンドの標準出力を表す文字列、またはコマンドの実行に失敗した場合は false です。
サンプルコード
PHP system 関数でOSコマンドを実行する
1<?php 2 3// このスクリプトは、PHPのsystem関数を使用してOSコマンドを実行する方法を示します。 4// system関数は、外部コマンドを実行し、その出力を直接標準出力(例: ターミナル、Webサーバーのログ)に表示します。 5// また、コマンドの終了ステータスも取得できます。 6 7/** 8 * system関数を使用してOSコマンドを実行し、その出力と終了コードを表示する例です。 9 * 10 * @return void 11 */ 12function executeSystemCommandExample(): void 13{ 14 echo "--- PHP system() 関数の実行例 ---\n\n"; 15 16 // 1. 成功するシンプルなコマンドを実行する例 17 // このコマンドは「Hello from PHP system() function!」という文字列を標準出力に出力し、 18 // 終了コードは通常0(成功)になります。 19 $command1 = 'echo "Hello from PHP system() function!"'; 20 $resultCode1 = null; // コマンドの終了コードを格納するための変数を初期化 21 22 echo "【成功するコマンドの実行】\n"; 23 echo " 実行コマンド: '{$command1}'\n"; 24 25 // system関数を実行。コマンドの出力は直接標準出力に送られ、 26 // system関数自体はコマンドの最後の行の出力、またはfalseを返します。 27 $systemOutput1 = system($command1, $resultCode1); 28 29 if ($systemOutput1 !== false) { 30 echo " - 結果: コマンドは正常に実行されました。\n"; 31 echo " - system()関数の戻り値 (コマンドの最後の行の出力): " . ($systemOutput1 === '' ? '[出力なし]' : $systemOutput1) . "\n"; 32 echo " - 終了コード: {$resultCode1}\n\n"; 33 } else { 34 echo " - エラー: コマンド '{$command1}' の実行に失敗しました。\n"; 35 echo " - 終了コード: {$resultCode1} (エラー発生時も設定されることがあります)\n\n"; 36 } 37 38 // 2. 意図的に失敗するコマンドを実行する例 39 // 存在しない架空のコマンドを実行しようとすると、通常エラーとなり、 40 // system関数はfalseを返し、終了コードは非0(例: 127 - コマンドが見つからない)になります。 41 $command2 = 'non_existent_command_xyz123'; // 存在しないコマンドの例 42 $resultCode2 = null; // コマンドの終了コードを格納するための変数を初期化 43 44 echo "【失敗するコマンドの実行】\n"; 45 echo " 実行コマンド: '{$command2}'\n"; 46 47 $systemOutput2 = system($command2, $resultCode2); 48 49 if ($systemOutput2 !== false) { 50 echo " - 結果: コマンドは正常に実行されました (予期せぬ結果)。\n"; 51 echo " - system()関数の戻り値 (コマンドの最後の行の出力): " . ($systemOutput2 === '' ? '[出力なし]' : $systemOutput2) . "\n"; 52 echo " - 終了コード: {$resultCode2}\n\n"; 53 } else { 54 echo " - エラー: コマンド '{$command2}' の実行に失敗しました。\n"; 55 echo " - system()関数の戻り値: false\n"; 56 echo " - 終了コード: {$resultCode2} (通常127など)\n\n"; 57 } 58 59 echo "--- 実行例 終了 ---\n"; 60} 61 62// 定義した関数を呼び出し、サンプルコードを実行します。 63executeSystemCommandExample(); 64 65?>
PHPのsystem関数は、サーバー上でOSのコマンドを実行し、その結果を直接出力するための関数です。
第1引数$commandには、実行したいOSコマンドを文字列で指定します。第2引数$result_codeには変数を指定でき、ここにはコマンドの実行結果を示す数値(終了コード)が格納されます。一般的に、終了コードが0の場合は成功、それ以外はエラーを示します。
system関数を実行すると、コマンドの出力はそのまま標準出力(ターミナルやブラウザ画面など)に表示されます。関数の戻り値は、コマンドが出力した内容の最後の行の文字列、またはコマンドの実行に失敗した場合にはfalseとなります。
このサンプルコードでは、まず成功するechoコマンドを実行し、コマンドの出力が直接表示されること、戻り値として出力の最後の行が返されること、そして第2引数に成功を示す終了コード0が設定されることを示しています。次に、存在しないコマンドで意図的に失敗させる例を示します。この場合、関数はfalseを返し、第2引数にはエラーを示す終了コードが格納されることを確認できます。
system関数はOSのコマンドを実行できる便利な機能ですが、セキュリティ上の注意が特に必要です。ユーザーが入力した文字列をコマンドに含める場合は、escapeshellarg関数で必ずエスケープ処理を行ってください。これを怠ると、意図しないコマンドを実行される脆弱性の原因になります。また、この関数はコマンドの実行結果を直接出力し、戻り値としては出力の最終行のみを返します。全ての出力を変数で受け取りたい場合はshell_exec関数などが適しています。コマンドの成功判定は、戻り値がfalseでないことと、第2引数で受け取る終了コードが0であることの両方を確認するのが確実です。
PHP system関数でOSコマンドを実行する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * system()関数を使用して外部コマンドを実行し、その結果を出力します。 7 * 8 * system()はコマンドの出力を直接表示し、出力の最後の行を返します。 9 * 第2引数には、コマンドの終了ステータスコードが格納されます(通常、0は成功を意味します)。 10 * Webサーバーのコンテキストで実行する場合、権限やセキュリティに十分注意してください。 11 * 12 * 似た関数であるexec()は、出力を直接表示せず、変数で受け取る点が主な違いです。 13 * 14 * @param string $command 実行したいOSのコマンド文字列。 15 * @return void 16 */ 17function runOsCommand(string $command): void 18{ 19 echo "========================================\n"; 20 echo "コマンドを実行します: {$command}\n"; 21 echo "----------------------------------------\n"; 22 echo "system()からの直接出力:\n\n"; 23 24 // system()関数を実行 25 // 第1引数: 実行するコマンド 26 // 第2引数: コマンドの終了コードを受け取る変数(参照渡し) 27 $lastLine = system($command, $resultCode); 28 29 echo "\n----------------------------------------\n"; 30 31 // 実行結果のサマリーを表示 32 if ($lastLine === false) { 33 echo "コマンドの実行に失敗しました。\n"; 34 } else { 35 echo "戻り値 (出力の最終行): " . $lastLine . "\n"; 36 } 37 38 echo "終了コード: {$resultCode}\n"; 39 echo ($resultCode === 0) ? "結果: 成功\n" : "結果: 失敗/エラー\n"; 40 echo "========================================\n\n"; 41} 42 43// 成功するコマンドの例 (Unix/Linux/macOSの場合) 44// Windowsの場合は 'dir' などに置き換えてください。 45$successfulCommand = 'ls -l'; 46runOsCommand($successfulCommand); 47 48// 失敗するコマンドの例 (存在しないコマンド) 49$failingCommand = 'non_existent_command'; 50runOsCommand($failingCommand); 51 52?>
PHPの system() 関数は、サーバー上でOSの外部コマンドを実行するための関数です。第一引数には、実行したいコマンドを文字列で指定します。例えば、Linux環境であれば ls -l のようなコマンドを渡します。
この関数の大きな特徴は、実行したコマンドの標準出力を直接ブラウザやコンソールに表示する点です。そして、戻り値としてはコマンドが出力した内容のうち「最後の行」の文字列を返します。もしコマンドの実行自体に失敗した場合は false を返します。
また、オプションの第二引数として変数を渡すと、その変数にコマンドの「終了ステータスコード」が格納されます。この値によって、コマンドが正常に終了したか(通常は 0)、エラーが発生したか(0以外)をプログラム側で判断できます。
似た機能を持つ exec() 関数との主な違いは、exec() がコマンドの出力を直接表示しないのに対し、system() は直接表示する点です。ユーザーからの入力をコマンドに含める場合は、セキュリティ上のリスクを避けるため、慎重な処理が必須となります。
system関数はOSのコマンドを実行できて便利ですが、セキュリティには特に注意が必要です。ユーザーが入力した文字列を直接コマンドに含めると、悪意のあるコマンドを実行される危険性があります。これを防ぐため、escapeshellarg()関数などで必ず入力を無害化(エスケープ)してください。また、この関数はコマンドの実行結果を直接出力し、戻り値としては出力の「最後の行」だけを返します。コマンドが成功したかどうかを正確に知るには、戻り値だけでなく、第2引数で受け取る終了コードが 0 であることを確認するのが確実です。実行権限はWebサーバーのユーザーに依存するため、アクセス権限にも注意しましょう。
PHP system()とexec()の違いを理解する
1<?php 2 3/** 4 * system() 関数と exec() 関数の動作の違いを示すサンプルコードです。 5 * 6 * system() は実行されたコマンドの出力を直接表示し、 7 * exec() は実行されたコマンドの出力を配列として取得します。 8 * 両関数ともに、コマンドの最終行を文字列として返します。 9 * 10 * @return void 11 */ 12function demonstrateExternalCommandExecution(): void 13{ 14 echo "--- system() 関数の使用例 ---" . PHP_EOL; 15 16 // system() は実行されたコマンドの出力を直接ブラウザ/コンソールに表示します。 17 // 戻り値はコマンド出力の最後の行、または false (失敗時) です。 18 // 第二引数でコマンドの終了コード (0:成功, それ以外:失敗) を取得できます。 19 // コマンドには PHP CLI を利用し、OS 依存性を低減しています。 20 $commandSystem = 'php -r "echo \'Hello from system() function.\'; echo \'This is the last line from system.\';"'; 21 $resultCodeSystem = null; // コマンドの終了コードを格納する変数を初期化 22 23 echo "実行コマンド: " . $commandSystem . PHP_EOL; 24 echo "system() からの直接出力 (以下に表示):" . PHP_EOL; 25 $outputSystemLastLine = system($commandSystem, $resultCodeSystem); 26 27 echo "system() の戻り値 (コマンド出力の最後の行): " . ($outputSystemLastLine !== false ? $outputSystemLastLine : '実行失敗') . PHP_EOL; 28 echo "system() の終了コード: " . $resultCodeSystem . PHP_EOL; 29 echo PHP_EOL; // 空行を追加して区切りを見やすくする 30 31 echo "--- exec() 関数の使用例 ---" . PHP_EOL; 32 33 // exec() は実行されたコマンドの出力を直接表示せず、配列として取得します。 34 // 戻り値はコマンド出力の最後の行、または false (失敗時) です。 35 // 第二引数で出力の全行を配列として取得し、第三引数でコマンドの終了コードを取得できます。 36 // コマンドには PHP CLI を利用し、OS 依存性を低減しています。 37 $commandExec = 'php -r "echo \'Line 1 from exec() function.\'; echo \'Line 2 from exec() function.\'; echo \'Line 3 from exec() function.\';"'; 38 $outputExecArray = []; // コマンドの出力行を格納する配列を初期化 39 $resultCodeExec = null; // コマンドの終了コードを格納する変数を初期化 40 41 echo "実行コマンド: " . $commandExec . PHP_EOL; 42 echo "exec() は出力を直接表示しません。以下は取得した配列の内容です。" . PHP_EOL; 43 $outputExecLastLine = exec($commandExec, $outputExecArray, $resultCodeExec); 44 45 echo "exec() の戻り値 (コマンド出力の最後の行): " . ($outputExecLastLine !== false ? $outputExecLastLine : '実行失敗') . PHP_EOL; 46 echo "exec() の終了コード: " . $resultCodeExec . PHP_EOL; 47 echo "exec() で取得した出力配列の内容:" . PHP_EOL; 48 if (!empty($outputExecArray)) { 49 foreach ($outputExecArray as $index => $line) { 50 echo " [" . $index . "]: " . $line . PHP_EOL; 51 } 52 } else { 53 echo " (出力なし)" . PHP_EOL; 54 } 55 echo PHP_EOL; // 空行を追加して区切りを見やすくする 56 57 echo "--- system() と exec() の出力動作比較 (補足) ---" . PHP_EOL; 58 echo "system(): コマンドの実行と同時に、その出力が逐次表示されます。" . PHP_EOL; 59 echo "exec(): コマンドの出力は内部でバッファリングされ、関数が完了した後に、" . PHP_EOL; 60 echo " 第二引数で渡した配列を通じてまとめて取得・表示できます。" . PHP_EOL; 61} 62 63// 関数を実行して、system() と exec() の違いを確認します。 64demonstrateExternalCommandExecution();
PHPのsystem()関数とexec()関数は、どちらも外部コマンドを実行する機能を提供しますが、その出力の扱い方に重要な違いがあります。
system()関数は、指定されたコマンドを実行すると、その標準出力を直接、ブラウザやコンソールに表示します。この関数の戻り値は、コマンド出力の最後の行を文字列として返します。コマンドの実行に失敗した場合はfalseが返されます。第二引数に整数型の変数を参照渡しすることで、コマンドの終了コード(0は成功、それ以外は失敗)を取得し、コマンドが正常に終了したかを確認できます。
対してexec()関数も外部コマンドを実行しますが、その出力を直接表示するのではなく、内部でバッファリングします。exec()の戻り値も、コマンド出力の最後の行を文字列として返します。実行失敗時はfalseです。exec()の大きな特徴は、第二引数に配列型の変数を参照渡しすることで、コマンドの出力全行を配列としてまとめて取得できる点です。また、第三引数に整数型の変数を参照渡しすれば、system()と同様にコマンドの終了コードを取得できます。
したがって、コマンドの実行結果を即座に表示したい場合はsystem()を、出力結果をプログラム内で加工したり、後から利用したりしたい場合はexec()と第二引数の配列を活用するのが一般的です。
system()関数はコマンドの出力を直接表示しますが、exec()関数は出力を配列で受け取り、後からまとめて処理する点が大きな違いです。どちらの関数も、実行するコマンドにユーザーからの入力などを直接含める場合は、必ずescapeshellcmd()やescapeshellarg()で適切にエスケープし、コマンドインジェクションなどのセキュリティ脆弱性を防いでください。コマンドの実行に失敗すると戻り値がfalseとなるため、結果の確認は重要です。また、第二引数で取得できる終了コード(0:成功、それ以外:失敗)も必ず確認し、適切なエラー処理を行うことをお勧めします。実行するコマンドはOS環境に依存するため、異なる環境での動作にも注意が必要です。
PHP system()でコマンド実行する
1<?php 2 3/** 4 * 初心者向けPHP system()関数使用例 5 * 6 * このスクリプトは、GETリクエストパラメータ 'cmd' からコマンドを受け取り、 7 * system()関数を使ってそのコマンドを実行し、結果と終了コードを表示します。 8 * 9 * !! 重要なセキュリティ上の注意 !! 10 * ユーザー入力を直接 system() 関数に渡すのは非常に危険です。 11 * OSコマンドインジェクションの脆弱性につながるため、 12 * 実際のウェブアプリケーションでは、入力の厳格なフィルタリングや 13 * ホワイトリスト方式による許可されたコマンドの構築が必須です。 14 * このコードはsystem()関数の動作を理解するための学習目的の簡略化された例です。 15 */ 16 17// GETリクエストからコマンドを取得。存在しない場合は空文字列をセット。 18$command = $_GET['cmd'] ?? ''; // PHP 7.0以降のnull合体演算子を使用 19 20// ブラウザで出力が見やすいように <pre> タグで囲む 21echo "<pre>"; 22 23if (!empty($command)) { 24 echo "--- コマンド実行 ---\n"; 25 // 実行するコマンドを表示。XSS対策としてhtmlspecialcharsを使用。 26 echo "実行コマンド: " . htmlspecialchars($command, ENT_QUOTES, 'UTF-8') . "\n\n"; 27 28 // コマンドの終了コードを格納するための変数を初期化 29 $resultCode = null; 30 31 // system() 関数を実行 32 // system() 関数はコマンドの出力を直接標準出力(この場合ウェブページ)に送ります。 33 // 関数自体の戻り値は、通常、コマンド出力の最後の行(文字列)または失敗時に false です。 34 $systemResult = system($command, $resultCode); 35 36 echo "\n--- 実行終了 ---\n"; 37 // system() 関数の戻り値を表示 38 echo "system() 関数の戻り値: " . (is_string($systemResult) ? htmlspecialchars($systemResult, ENT_QUOTES, 'UTF-8') : "false (コマンド実行失敗)") . "\n"; 39 // コマンドの終了コードを表示 40 echo "終了コード: " . ($resultCode !== null ? $resultCode : "取得失敗") . "\n"; 41} else { 42 echo "コマンドを指定してください。\n"; 43 echo "例: このURLの末尾に '?cmd=ls -l' を追加してください。\n"; 44 echo "例: このURLの末尾に '?cmd=echo \"Hello from PHP system!\"' を追加してください。\n"; 45} 46 47echo "</pre>"; 48 49?>
PHPのsystem()関数は、ウェブサーバーが動作しているOS上で外部コマンドを実行するための機能です。このサンプルコードは、GETリクエストで受け取ったcmdパラメータの値をコマンドとしてsystem()関数に渡し、その実行結果と終了コードを表示する方法を示しています。
system()関数の第一引数 $command には、実行したいOSコマンドを文字列で指定します。この例では$_GET['cmd']から取得した値を直接使用しています。第二引数 $result_code はオプションで、変数への参照を渡すことで、コマンドが終了した際の終了コードをその変数に格納することができます。
system()関数は、実行したコマンドの出力を直接ウェブページ(標準出力)に表示します。関数自体の戻り値は、コマンド出力の最後の行の文字列であるか、コマンドの実行に失敗した場合はfalseとなります。サンプルコードでは、これらの情報も表示しています。
非常に重要なセキュリティ上の注意点として、ユーザーからの入力値を直接system()関数に渡すことは、OSコマンドインジェクションという重大な脆弱性を引き起こす可能性があるため、実際のシステム開発では絶対に行わないでください。 このサンプルコードはsystem()関数の動作を理解するための学習目的の簡略化された例であり、セキュリティ対策が施されていません。実運用では、入力値の厳格なフィルタリングや、許可されたコマンドのみを実行するような安全な設計が不可欠です。
このサンプルコードはPHPのsystem()関数の学習用ですが、ユーザー入力を直接渡すとOSコマンドインジェクションという深刻なセキュリティ脆弱性につながります。実運用では厳格な入力検証やホワイトリスト方式でのコマンド許可を徹底してください。system()関数はコマンドの出力を直接標準出力へ表示し、戻り値は最後の出力行、失敗時はfalseです。終了コードは第二引数で参照渡しにより取得できます。本コードは学習目的であり、本番環境での利用はセキュリティリスクを十分に理解し、極力避けてください。