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


クラウディア 


1. 概要
2. exec 外部モジュールを実行する
3.  エラー出力も取り込む
4. system 外部モジュールを実行する
5. 参考サイト

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

audiobook.jp
AbemaTV 無料体験