【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サーバーのユーザーに依存するため、アクセス権限にも注意しましょう。