php - よく使う関数 - プロセス制御

 
1. exec 外部モジュールを実行する
2.  エラー出力も取り込む
3. system 外部モジュールを実行する

1. 外部のロードモジュールを実行する

 本項は「【PHP入門】外部コマンドの実行(exec)とコマンドライン実行の方法 | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト」を参考にさせていただきました。  exec の詳細は「PHP: exec - Manual」をご参照ください。

string exec ( string $command [, array &$output [, int &$return_var ]] )
 この関数の場合、標準出力されるものが複数あれば、配列として第2引数に出力させてやる必要があります。  ということで
<?php
$array = Array();

exec('ls -a', $array);

foreach ($array as $value)
{
	print("$value\n");
}
?>

 というソースを書いて実行すると  下記の結果が得られます(実際に動作している箇所に存在するものです)
.
..
exec.php
readprint0.2.php
system.php

2. エラー出力も取り込む

 ところが・・・だ。
<?php
$array = Array();

exec('ls *.txt', $array);

foreach ($array as $value)
{
	print("$value\n");
}
?>

 というソースを書いて実行するとします。  カレントディレクトリに *.txt が存在しない場合、File not Found のメッセージが、コマンドラインから実行する分には出力されるのですが。  ウェブ上で動かすと、ウェブサーバのエラーログには出力されるもののブラウザ上には表示されないのです。  ある意味当たり前の話ではあります。  そういう場合どうするか検索してみたら「PHP - exec()のエラーハンドリングと標準エラー出力の関係をまとめる - Qiita」に対処方法が書かれていましたので参考にさせていただきます。
<?php
$array = Array();

exec('ls *.txt 2>&1', $array);

foreach ($array as $value)
{
	print("$value\n");
}
?>

 と「2>&1」でリダイレクトさせてやると  下記のようにエラーメッセージをブラウザ上に表示することができます。
ls: *.txt: No such file or directory

3. system

 こちらは、外部モジュールが標準出力にある場合、そのまま標準出力に表示されます。  詳細は「PHP: system - Manual」をご参照ください。

string system ( string $command [, int &$return_var ] )
<?php
system('ls -a');
?>

 というソースを書いて実行すると  下記の結果が得られます
..
exec.php
readprint0.2.php