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
exec.txt
exec02.php
exec03.php
exec03.txt
shell_exec.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
exec.txt
exec02.php
exec03.php
exec03.txt
shell_exec.php
system.php
system.txt