PEAR::Console_CommandLineで引数を管理する

By shin - 08/10/02 - このエントリをはてなブックマークに追加このエントリをYahoo!ブックマークに追加このエントリをdel.icio.usに追加このエントリをFC2ブックマークに追加

WEBサイトを開発・運営していると、携帯サイトに限らず、コマンドラインからプログラムを実行する機会はよくあると思います。

  • 一日に一度アクセス解析結果をDBに保存したい
  • 空メールを受信した際にプログラムを走らせたい

PHPでこれらを実装する際、上記の様に引数やオプションを取らずに行える処理であれば問題は無いのですが、機能追加や更新で、渡される引数やオプションが増えてきた場合、デフォルトだとargvやgetopt()で取得する事になります。ですが、それが増えてくると引数の順番が無茶苦茶になるなど煩雑なプログラムになりがちです。

PHPのバージョンが5.1.0以上の場合、これからご紹介するPEAR::Console_CommandLineを使えば、簡単にその様な問題から解放され、汎用性の高いプログラムを書く事が出来ます。

PEAR::Console_CommandLineのインストール

[root@host]# pear install Console_CommandLine

PEAR::Console_CommandLineの使い方

PEAR::Console_CommandLineには標準で「-v」「–version」といったバージョンの表示や、「-h」「–help」のヘルプ表示オプションが用意されています。「-v」では上記の「version」が、「-h」「–help」では上記の「description」に加え、これから設定するオプションや引数の各パラメーターが利用されます。また、より詳細な各パラメーターの情報はPEARのマニュアルページを参照して下さい。

インスタンスを作成する

// パーサの作成
require_once 'Console/CommandLine.php';
$parser = new Console_CommandLine(array(
    'version'     => '1.0.0',
    'description' =>
    "========================\n"
    ." サンプルプログラム\n"
    ." これはサンプルプログラムです\n"
    ."========================",
));

許可する引数を設定する

// 引数のセット
$parser->addArgument('action',array(
    'description' => '実行内容 [start|stop|restart|status]',
));

許可するオプションを設定する

// オプションのセット
$parser->addOption('carrier', array(
    'description' => '対象キャリア名[docomo|au|softbank|ALL]',
    'help_name'   => '[キャリア名]',
    'short_name'  => '-c',
    'long_name'   => '--carrier',
    'default'     => 'ALL',
    'action'      => 'StoreString',
));

・入力値を検証・修正するにはcallbackを利用します

function sampleCallback($value, $option, $result, $parser, $params=array())
{
    // 小文字で統一する
    $value = strtolower($value);

    // キャリア名を判別する
    if (!in_array($value, $params['allowedCarrier'])) {
        require_once 'Sample/Exception.php';
        throw new Sample_Exception('Invalid Carrier name :'.$value);
    }

    return $value;
}

// オプションのセット
$parser->addOption('carrier', array(
    'description' => '対象キャリア名[docomo|au|softbank]',
    'help_name'   => '[キャリア名]',
    'short_name'  => '-c',
    'long_name'   => '--carrier',
    'action'      => 'Callback',
    'calback'     => 'sampleCallback',
    'action_params' => array( // sampleCallbackへ渡す
        'allowedCarrier' => array('docomo', 'au', 'softbank')
    ),
));

入力値を受け取る

// パーサの実行
try {
    $result = $parser->parse();
    require_once 'Sample.php';
    $sample = new Sample($result->args['action'], $result->options);
    $sample->execute();

} catch (Exception $e) {
    $parser->displayError($e->getMessage());
}

設定をXMLファイルで管理する

@sample.xml


<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<command>
    <description>これはサンプルプログラムです</description>
    <version>1.0.0</version>
    <option name="verbose">
        <short_name>-c</short_name>
        <long_name>--carrier</long_name>
        <description>対象キャリア名[docomo|au|softbank|ALL]</description>
        <action>StoreTrue</action>
        <default>ALL</default>
    </option>
    <argument name="action">
        <description>実行内容 [start|stop|restart|status]</description>
    </argument>
</command>
// XMLからパーサの作成
$xmlfile = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'sample.xml';
$parser = Console_CommandLine::fromXmlFile($xmlfile);

実行する

[root@host]# sample.php -c docomo start

これで柔軟な機能を提供できるプログラムになったのでは無いでしょうか。
実際のところ、今回の様な処理が必要になる機会は少ないかもしれませんが、これを利用すれば他の言語が苦手な方でも、PHPを利用してアプリケーションやコマンドを作成出来るのでは無いでしょうか?

参考URL