忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP Windowsでのバッチ処理における実行結果による制御について(exit()関数とバッチのerrorlevel)

今回はPHPのプログラムをWindowsでのバッチ処理で実行する時の、実行結果による制御について説明します。

通常、PHPのプログラムを途中終了させるには exit() 関数を用います。この関数ですが、PHPの公式サイトによれば以下の様に定義されています。

// exitの引数が文字列の場合
exit ([ string $status ] ) : void
// exitの引数が数値の場合
exit ( int $status ) : void

【PHP公式マニュアルより】
status が文字列の場合は、この関数は終了直前に status を表示します。

status が int の場合は その値が終了ステータスとして使われ、表示はされません。
終了ステータスは 0 から 254 までの値でなければなりません。
終了ステータス 255 は PHP に予約されており、使用してはいけません。
ステータス 0 は、 プログラムを正常終了させる際に使用します。


普通、終了させる場合には exit() と引数が無い状態で使いますが exit(0) とか exit(1) とすることで、 PHPプログラムの終了ステータスを呼出し元に返せる様です。




exit() の使用例

コマンドプロンプトでのプログラムの実行を想定し引数が指定されていれば正常とし、未指定であればエラーとするプログラムを以下に示します。 $argv 変数のインデックス「1」が宣言されていれば正常を表示し exit(0) を行い、未宣言であればエラーを表示し exit(1) を行います。

<?php
//	ソースファイル[exit1.php]
if (isset($argv[1]) == true) {
    // 引数$argv[1]が指定された場合、正常終了
    echo mb_convert_encoding("正常終了", "SJIS", "UTF-8");
    exit(0);
} else {
    // 引数$argv[1]が未指定の場合、エラー終了
    echo mb_convert_encoding("エラー終了", "SJIS", "UTF-8");
    exit(1);
}
?>


私の環境ではWindowsの xampp でPHPを導入し、DOSのコマンドプロンプトからの実行を行っています。 始めの実行は引数無しで行い、「エラー終了」が表示されます。その後、引数を指定した実行で「正常終了」が表示されます。

C:\>C:\xampp\php\php.exe C:\xampp\htdocs\_test\exit1.php
エラー終了
C:\>C:\xampp\php\php.exe C:\xampp\htdocs\_test\exit1.php 111
正常終了
C:\>

このままでは exit() で返される値が分からないので、バッチファイルでプログラムを起動する様にします。


バッチ での使用例

それでは上記のプログラムを表示部分を省いて終了コードのみを返す様にします。(ファイル名を「exit2.php」に変更)

<?php
//	ソースファイル[exit2.php]
if (isset($argv[1]) == true) {
    // 引数$argv[1]が指定された場合、正常終了
    exit(0);
} else {
    // 引数$argv[1]が未指定の場合、エラー終了
    exit(1);
}
?>

これをバッチで実行するファイルを以下に示します。(ファイル名を「exit1.bat」とする)

C:\xampp\php\php.exe C:\xampp\htdocs\_test\exit2.php 111

@echo off
if %errorlevel% == 0 (
  echo "正常"
) else (
  echo "エラー"
)

@echo on
C:\xampp\php\php.exe C:\xampp\htdocs\_test\exit2.php

@echo off
if %errorlevel% == 0 (
  echo "正常"
) else (
  echo "エラー"
)


バッチでは errorlevel 変数にプログラムの終了コードが返されますので、その値を判定し処理を制御します。
バッチファイルの実行は以下の様になります。(フォルダを「C:\xampp\htdocs\_test」に移動して実行)

C:\xampp\htdocs\_test>exit1.bat

C:\xampp\htdocs\_test>C:\xampp\php\php.exe C:\xampp\htdocs\_test\exit2.php 111
"正常"

C:\xampp\htdocs\_test>C:\xampp\php\php.exe C:\xampp\htdocs\_test\exit2.php
"エラー"

C:\xampp\htdocs\_test>

PHPプログラムの中でいろんなレベルの異常終了が在ると思いますので、それぞれの終了コードを決めてバッチ側で各種の処理を行うことが可能になります。



バッチ に関連してプログラムの CLI 及び ブラウザ 実行について

上記まではPHPスクリプトのコマンドラインでの実行、つまり CLI での実行を行いました。 (CLI とは Command Line Interface 略称なのでコマンドライン実行のことなのですが)

プログラムが CLI からの実行なのかそれとも ブラウザ からの実行なのかで処理を分けたい場合があると思います。
そのためどこからの呼出なのかを判定できる関数として php_sapi_name() があります。
php_sapi_name() はウェブサーバーと PHP の間のインターフェイスの型を返します。
("apache", "apache2handler", "cgi-fcgi", "cli", "cli-server" ,...)

そこで何かの表示を行う場合、この関数の返す値により、コマンドライン実行であれば表示文字列を「Shift-JIS」変換し、そうでなければそのまま出力する様にします。

<?php
//	ソースファイル[exit3.php] (ソースの文字コードは「UTF-8」で登録)
$str = "出力する文字列例です。"."\n";
if (php_sapi_name() == "cli") {
    // コマンドライン実行の場合 Shift-JIS変換
    $str mb_convert_encoding($str, "SJIS", "UTF-8");
}
echo $str;
?>

これをコマンドライン実行すると以下の様になります。

C:\xampp\htdocs\_test>C:\xampp\php\php.exe C:\xampp\htdocs\_test\exit3.php
出力する文字列例です。

C:\xampp\htdocs\_test>

尚、ブラウザで実行させても以下の表示になります。

出力する文字列例です。












PR

コメント

コメントを書く