2011年06月09日

PHP execとsystemの違い サンプルプログラム(PHPマニュアル)

PHP execとsystemの違い サンプルプログラム(PHPマニュアル)

まず、仕様は、マニュアルを読んでください。
exec
system

<サンプルプログラム例1>検証:正常例
■プログラム
$cmd = "ls -l";
echo "cmd[$cmd]\n";
print "******exec********\n";
exec( $cmd, $output, $return_code );
print_r( $output );
print "return_code[$return_code]\n\n";

print "******system********\n";
system( $cmd, $return_code );
print "return_code[$return_code]\n";

■実行結果
******exec********
Array
(
[0] => 合計 0
[1] => -rw-r--r-- 1 devuser devgroup 0 2011-06-09 17:14 test1
[2] => -rw-r--r-- 1 devuser devgroup 0 2011-06-09 17:14 test2
)
return_code[0]

******system********
合計 0
-rw-r--r-- 1 devuser devgroup 0 2011-06-09 17:14 test1
-rw-r--r-- 1 devuser devgroup 0 2011-06-09 17:14 test2
return_code[0]

■ポイント
 execの場合、標準出力を配列に格納する。(標準出力は表示されない。)
 systemの場合、標準出力がそのまま表示されている。


<サンプルプログラム例2>検証:異常例
■プログラム
//lsの不正オプションを指定、標準エラーをキャッチする
$cmd = "ls -z 2>&1";
echo "cmd[$cmd]\n";
print "******exec********\n";
exec( $cmd, $output, $return_code );
print_r( $output );
print "return_code[$return_code]\n\n";

print "******system********\n";
system( $cmd, $return_code );
print "return_code[$return_code]\n";

■実行結果
******exec********
Array
(
[0] => ls: オプションが違います -- z
[1] => 詳しくは `ls --help' を実行して下さい.
)
return_code[1]

******system********
ls: オプションが違います -- z
詳しくは `ls --help' を実行して下さい.
return_code[1]

■ポイント
2>&1で、標準エラーもキャッチすれば、標準エラーも配列に格納する。
2>&1を指定しない場合は、標準エラーは、配列に格納されず、画面出力される。


検証の結果、発行するコマンドや処理によって、使い分けが必要になると思います。
たとえば、tarコマンドを発行して、配列に結果を格納してしまったら、かなりのメモリを消費してしまうので、systemコマンドにしたり、lsの結果を使って処理が必要な場合は、execコマンドを使用することになります。

コマンドを発行して、成功か失敗かだけを知りたい場合は、systemを使用します。

<正式プログラム>
$cmd = "ls -l 2>&1";
print "******exec********\n";
exec( $cmd, $output2, $return_code );
if( $return_code != 0 ){
print "ERROR:コマンドエラー[$cmd]\n";
foreach($output2 as $val){
print "ERROR:$val\n";
}
exit;
}
foreach($output2 as $val){
print "OUTPUT:$val\n";
}


$cmd = "ls -l";
if( $return_code != 0 ){
print "ERROR:コマンドエラー[$cmd]\n";
exit;
}

※コマンドの生のエラーメッセージは、ログ出力できませんが、エラーになった$cmdを出力して、ターミナルで、叩いてみるといいと思います。

※systemもexecも復帰値は、微妙すぎて使いません。




このエントリーをはてなブックマークに追加

にほんブログ村 IT技術ブログ IT技術メモへ←もし、役立つ情報だったらクリックお願いします。 <<

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/kumagai_nori/52190338