[PHP]cron(コマンド)から動作させた時に引数を設定する方法

PHPでバッチ処理を書いている人は少なからずいると思います。
バッチ処理の実行はcronですが、何かするときにコマンドからプログラムを実行する事もあるでしょう。
実行する際に、引数を渡してプログラム内で使いたい!と思った事はありませんか?

私は今までそのような機会がなかったのですが、どうしても必要に迫られて引数の設定ができるのか調査したらできるとの事なので紹介します。

コマンドでの実行

まずは基本的なコマンドでの実行方法を見てみましょう。

# PATHを含めて実行する方法
$ php /home/example/example.php

# /home/exampleに移動済みで実行する方法
$ php example.php

単純ではありますがまずはこれが基本になります。
では、引数をどうやって設定すればいいのか?ですが、思いつくのはGETパラメータにしたら渡したらできるでしょ!っていう考えになるかと思います。
だって、ブラウザではそれができるんですもん(笑)

GETパラメータを設定してみた

GETパラメータ方法で一度挑戦してみます。

// example.php
echo $_GET['name'];

上記にはPHPで取得した値をechoしているだけです。
コマンドは下記で実行してみると…

$ php example.php?name=test
Could not open input file: example.php?name=test

ん??

Could not open input file: example.php?name=test

な…なぜだ!!
ファイルが開けないだと!?と思ってもしょうがないんですけどね(笑)

じゃあ、どうすればいいのよ!!!という事ですがちゃんと方法あります。

正しく引数を設定する

ここからが本題です(笑)

ではどうやったら引数が渡せるのか?という事ですが、ここは単純に他のコマンドと同様の事をしてあげればいいだけですがPHPは他のSHELLとは違うので注意です。

$ php example.php test
// example.php
echo $argv[1]; // test

PHPでは引数を「$argv」で取得する事ができます。
$argv[0]は常に実行スクリプト名が入りますので、$argv[1]から順番に取得する事になります。

うん…でも期待しているものと違う!!!

はい、言いたいことはわかりますよ。
順番に取得する事はわかったけど、パラメータとして設定したいんですよね??そうですよね!!!!

$ php example.php name=test
// example.php
echo $argv['name']; // test

これが理想ですけど、実はできないんです。
仕様なのだからしょうがないのですが、もしかしたら順番がばらばらになって指定されちゃうかもしれません。
という事で!!!下記の関数みたいな感じで作っちゃいましょう!

// example.php

function argvArray($argv)
{
    $return = array();

    foreach ($argv as $key => $item) {
        if ($key == 0) {
            continue;
        }

        list($param, $value) = explode('=', $item);
        $return[$param] = $value;
    }

    return $return;
}

$result = argvArray($argv);
echo $result['name']; // test

$argvの値をforeachで回しexampleを使用して「=」で切り分けています。
引数でくる「=」は1つだけと想定しているのでこれで十分だと思います。

ほんのすこし手間はかかりますが、これでやりたい事が出来るようになりました。

スポンサーリンク
  • このエントリーをはてなブックマークに追加
スポンサーリンク

コメント

  1. hiyo より:

    getopt で良いのではないかと思います。
    http://php.net/manual/ja/function.getopt.php

コメントをどうぞ

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください