1. 概要
本ページは、プロセス制御に関する関数について記述します。
2. 外部のロードモジュールを実行する
詳細は、参考サイトをご参照ください。
string exec ( string $command [, array &$output [, int &$return_var ]] )
この関数の場合、標準出力されるものが複数あれば、配列として第2引数に出力させてやる必要があります。
ということで。
<?php
$array = Array();
exec('ls -a', $array);
foreach ($array as $value)
{
print("$value\n");
}
?>
というソースを書いて実行すると。
下記の結果が得られます(実際に動作している箇所に存在するものです)
.
..
.bash_history
.bash_profile
.bundle
.cache
.cargo
.composer
・・・ 以下略 ・・・
3. エラー出力も取り込む
ところが・・・だ。
<?php
$array = Array();
exec('ls *.txt', $array);
foreach ($array as $value)
{
print("$value\n");
}
?>
というソースを書いて実行するとします。
カレントディレクトリに *.txt が存在しない場合、File not Found のメッセージが、コマンドラインから実行する分には出力されるのですが。
ウェブ上で動かすと、ウェブサーバのエラーログには出力されるもののブラウザ上には表示されないのです。
ある意味当たり前の話ではあります。
そういう場合どうするか検索してみたら。参考サイトに対処方法が書かれていましたので。参考にさせていただきます。
<?php
$array = Array();
exec('ls *.txt 2>&1', $array);
foreach ($array as $value)
{
print("$value\n");
}
?>
と「2>&1」でリダイレクトさせてやると
下記のようにエラーメッセージをブラウザ上に表示することができます。
ls: *.txt: そのようなファイルまたはディレクトリはありません
4. system
こちらは、外部モジュールが標準出力にある場合、そのまま標準出力に表示されます。
詳細は「PHP: system - Manual」をご参照ください。
string system ( string $command [, int &$return_var ] )
<?php
system('ls -a');
?>
というソースを書いて実行すると
下記のような、結果が得られます
(あたりまえですが、実際に、ディレクトリに存在するファイルによって変わります)
.
..
exec.php
exec02.php
exec03.php
shell_exec.php
system.php
5. 参考サイト
本ページは、下記のサイトを参考にさせていただきました。
「PHP - exec()のエラーハンドリングと標準エラー出力の関係をまとめる」
「【PHP入門】外部コマンドの実行(exec)とコマンドライン実行の方法」
「PHP: system - Manual」