- 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");
}
?>
というソースを書いて実行すると。
下記の結果が得られます(実際に動作している箇所に存在するものです)
[/home/hogehoge/lang/php/exec/exec.txt] というファイルが、なかったですじゃ・・・。
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」でリダイレクトさせてやると
下記のようにエラーメッセージをブラウザ上に表示することができます。
[/home/hogehoge/lang/php/exec/exec03.txt] というファイルが、なかったですじゃ・・・。
3. system
こちらは、外部モジュールが標準出力にある場合、そのまま標準出力に表示されます。
詳細は「PHP: system - Manual」をご参照ください。
string system ( string $command [, int &$return_var ] )
<?php
system('ls -a');
?>
というソースを書いて実行すると
下記の結果が得られます
[/home/hogehoge/lang/php/exec/system.txt] というファイルが、なかったですじゃ・・・。
|
|