こんにちはフロントエンドエンジニアのまさにょんです!
今回は、PHPのsystem関数とexec関数の違いと使い方について解説していきます。
目次
system関数とexec関数の違いは?
system関数とexec関数の違いは、コマンドの実行結果をデフォルトで出力するかどうかです。
外部コマンドを実行するという点ではまったく同じの関数ですが、
system関数はコマンドの実行結果を出力しますが、exec関数はコマンドを実行結果を出力せず変数に格納するという挙動の違いがあります。
上記のような違いがあるので、
「コマンドの実行結果をPHP側で出力する必要があるか?」や、
「コマンドの実行結果を変数に格納して使用したいか?」などが使い分けの判断基準になりそうです。
system関数の使い方-Sample
system関数では、実行したコマンドの実行結果がデフォルトで出力されます。
<?php
echo 'ls -al コマンドの出力 Ver. system()' . "\n";
// 1. system() では、実行したコマンドの実行結果がデフォルトで出力される!
$last_line = system('ls -al', $result_code);
echo 'system(ls -al) コマンド実行後の出力' . "\n";
// 2. $last_line(戻り値): 成功時はコマンド出力の最後の行を返し、失敗時は false を返します。
echo $last_line . "\n";
// 3. 引数 result_code が存在する場合、 実行したコマンドの返すステータスがこの変数に書かれます。
echo $result_code . "\n";
// [ php コマンドの実行結果 ]
// ls -al コマンドの出力 Ver. system()
// total 56
// drw-rw-rw- 2 robotama 0 0 2022-12-14 16:08 .
// dr--r--r-- 23 robotama 0 49152 2022-12-15 10:02 ..
// -rw-rw-rw- 1 robotama 0 1235 2022-12-14 16:05 boolean.php
// -rw-rw-rw- 1 robotama 0 2148 2022-12-15 15:01 exec_system.php
// system(ls -al) コマンド実行後の出力
// -rw-rw-rw- 1 robotama 0 2148 2022-12-15 15:01 exec_system.php
// 0
exec関数の使い方-Sample
exec関数では、コマンドの実行結果は出力されず、第二引数に格納されます。
なので、コマンドの実行結果を変数に格納して、何かしらの処理に使用したい場合は、exec関数が適しているでしょう。
<?php
echo 'ls -al コマンドの出力 Ver. exec()' . "\n";
// 1. exec() では、コマンドの実行結果は出力されず、第二引数に格納される!
$last_line = exec('ls -al', $output, $result_code);
// 2. $last_line(戻り値): 成功時はコマンド出力の最後の行を返し、失敗時は false を返します。
echo $last_line . "\n";
// -rw-rw-rw- 1 robotama 0 3017 2022-12-15 15:08 exec_system.php
// 3. 引数 result_code が存在する場合、 実行したコマンドの返すステータスがこの変数に書かれます。
echo $result_code . "\n";
echo 'exec(ls -al) コマンドの実行結果を出力' . "\n";
var_export($output);
foreach ($output as $val) {
echo $val . "\n";
}
// [ php コマンドの実行結果 ]
// ls -al コマンドの出力 Ver. exec()
// -rw-rw-rw- 1 robotama 0 3017 2022-12-15 15:08 exec_system.php
// 0
// exec(ls -al) コマンドの実行結果を出力
// array (
// 0 => 'total 56',
// 1 => 'drw-rw-rw- 2 robotama 0 0 2022-12-14 16:08 .',
// 2 => 'dr--r--r-- 23 robotama 0 49152 2022-12-15 10:02 ..',
// 3 => '-rw-rw-rw- 1 robotama 0 1235 2022-12-14 16:05 boolean.php',
// 4 => '-rw-rw-rw- 1 robotama 0 3017 2022-12-15 15:08 exec_system.php',
// )
// total 56
// drw-rw-rw- 2 robotama 0 0 2022-12-14 16:08 .
// dr--r--r-- 23 robotama 0 49152 2022-12-15 10:02 ..
// -rw-rw-rw- 1 robotama 0 1235 2022-12-14 16:05 boolean.php
// -rw-rw-rw- 1 robotama 0 3017 2022-12-15 15:08 exec_system.php
Twitterやってます!Follow Me!
神聖グンマー帝国の逆襲🔥
神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!