外部プログラムの実行

PHPから外部のプログラムを実行する方法について解説します。

shell_exec()

シェルによりコマンドを実行し、文字列として出力全体を返します。

string shell_exec ( string $cmd )
PHP: shell_exec - Manual

この関数はバッククォート演算子 (backquote operator) のエイリアスです。よって

$output = shell_exec( 'ls -al' );

は、バッククォート (グレイブ アクセント) を用いて

$output = `ls -al`;

のようにも記述できます。なおバッククォート演算子は、バックティック演算子 (backtick operator) または実行演算子 (execution operator) とも呼ばれます。PHP: 実行演算子 - Manual

exec()

外部プログラムを実行します。

string exec (
    string $command
    [, array &$output
    [, int &$return_var ]] )
PHP: exec - Manual
shell_exec()とexec()の比較
  出力の取得方法 セーフモードでの実行
shell_exec() 出力の全体を、戻り値で取得 不可
exec()
  • 出力の最後の行だけ、戻り値で取得
  • 他は、第2引数で配列として取得
shell - php shell_exec() vs exec() - Stack Overflow

passthru()

外部プログラムを実行し、未整形の出力を表示します。戻り値はなく、出力は直接ブラウザへ渡されるため、バイナリデータを返すコマンドで使用します。

void passthru (
    string $command
    [, int &$return_var ] )
PHP: passthru - Manual

system()

外部プログラムを実行し、出力を表示します。

string system (
    string $command
    [, int &$return_var ] )
PHP: system - Manual

proc_open()

コマンドを実行し、入出力用にファイルポインタを開きます。

resource proc_open (
    string $cmd ,           // 実行するコマンド
    array $descriptorspec , // プロセスに渡すデータ
    array &$pipes           // ファイルポインタの配列
    [, string $cwd          // コマンドの初期作業ディレクトリ
    [, array $env           // コマンドの環境変数の配列
    [, array $other_options // 追加オプション
    ]]] )
PHP: proc_open - Manual

その他

不正なコマンドの実行防止

不正なコマンドの実行を防止するため、ユーザーからの入力をコマンドに渡すときには、必ず文字列をエスケープします。

PHPのescapeshellcmdを巡る冒険 | 徳丸浩の日記 (2012/04/09)

エラーの取得

コマンドが期待する動作をしないときには、コマンドの後に「2>&1」を追記します。これで標準エラー出力が標準出力へリダイレクトされるため、出力結果でエラーを確認できます。UNIXの部屋 コマンド検索:リダイレクト (*BSD/Linux)

たとえば次のように実行すると、

echo shell_exec( 'command 2>&1' );

次のようにエラーが出力されます。

'command' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
PHPのマニュアルから検索