PHPのコンソールツールを作る時に役立つTIPS 4選


こんにちは。
開発チームのワイルド担当、まんだいです。

ちょっとしたツールを作って煩雑な作業を自動化したいという衝動に駆られる事はよくありますよね。
俗にいう、カッとなって作る、という感じなのかと思いますが、そういうツールは得てしてやることが決まっている分、わざわざブラウザ立ち上げて動かすようなものではないのは皆様も経験があるでしょう。
そのブラウザ立ち上げて・・・の件から自動化したいのですからね。

そういう時はコンソールツールにしてしまい、定期実行なりにする訳ですがPHPもコンソールアプリがやれるんだぜということで、そんな時に役立つ豆知識を集めてみました。
主にLinux上でしか動作確認しておりませんので悪しからず。

 

ホームディレクトリのパスを取得する

コンソールといえばシェルスクリプト、という事で
シェルスクリプトの場合、ホームディレクトリのパスは「~」で取得できます。

PHPでも同様のパスを指定して、ユーザーのホームディレクトリに存在するファイルをロードしようとするとエラーが発生します。

<?php
echo file_get_contents('~/hogehoge.txt');

# 上記のソースを実行すると、以下のエラーが発生
PHP Warning:  file_get_contents(~/hogehoge.txt): failed to open stream: No such file or directory in Command line code on line 1

 
じゃあ、実行ユーザーを取得して/homeとくっつけて…と色々やって何とかパスを作りたくなるのですが
ホームディレクトリのパスはスーパーグローバル変数の$_SERVERにちゃんと格納されています。

<?php
echo file_get_contents($_SERVER['HOME']. '/hogehoge.txt');

# 上記のソースを実行すると、テキストファイルの中身が表示される
hogehoge

 
bashっぽく、コンフィグファイルをユーザーホームに置きたい時には重宝します。
コンソール実行なのに、$_SERVER変数にデータが入ってるのは盲点です(した)。
ドキュメントにも載っていない隠しパラメータ的な存在です。
(本文の後のコメント上に、さらっと出ています)

 

引数の取り方

引数によって動作を変えるのはコマンドラインの世界では当然の事ですので、PHPCLIでももちろんできます。
ただ、スーパーグローバル変数なのに

  • _から始まらない
  • 大文字で定義されていない
  • cなの? vなの? はっきりしてよ!

という感じでパッと単語が出てこなくて、しばらく使ってないと忘れてしまいます。

実行時に渡された引数が格納されているスーパーグローバル変数は$argvです。

また、$argvに改行入りの文字列を渡したい場合は「”」または「’」で文字列を括ると意図した通りに動作します。

例えば、以下の様な引数をダイレクトにvar_dumpするだけのソースを用意します。

<?php
var_dump($argv);

 
次に、改行込みの文字列を引数に、ソースを実行してみます。

php test.php hogehoge '改行
いれたるで'

# 上記のコマンドを実行すると、以下のように表示される
array(3) {
  [0] =>
  string(8) "test.php"
  [1] =>
  string(8) "hogehoge"
  [2] =>
  string(22) "改行
いれたるで"
}

 
色々と捗りそうです。

 

エラーメッセージに色を付けてみる (+おまけ)

遊び心を入れたければ、エラーメッセージに色を付けてみるというのはどうでしょうか?

Linuxでは、echoする文字列をカラフルにしたり、背景色をいじったりする事ができます。

これと同じ手法を使うと簡単に実現できます。

<?php
# hogehogeを赤字で表示するコード
echo "\e[31mhogehoge\e[m";
echo "\033[31mhogehoge\033[m";

 
上記のコードはどちらもhogehogeを赤色で表示する訳ですが、一見何のことやら理解できないので
少しバラしてみます。

<?php
# hogehogeを赤字で表示するコード
echo "\e[31m". "hogehoge". "\e[m";
echo "\033[31m". "hogehoge". "\033[m";

 
「hogehoge」の部分とそうでない部分に分けてみます。すると、何となく法則性が見つかりました。
色を変えたい文字列を「 \e[**m 」もしくは、「 \033[**m 」で括ってやるといいようです。

後は、先頭の部分だけに付いている「31」というところですが
この部分が文字色の指定になります。
31を3と1に分け、3を文字色の指定、1を赤色の指定という風に読みます。
つまり、文字色を別の色に指定する時は1を2に変える、と言った塩梅です。

31の3の部分が文字色の指定になると書きましたが、これが4になると、背景色の指定になります。
つまり

<?php
echo "\e[41m". "hogehoge". "\e[m";
echo "\033[41m". "hogehoge". "\033[m";

 
上記のコードは、背景色が赤で表示されることになります。

合わせ技で、文字色も背景色も変更したい場合は、それぞれをセミコロンを挟んで並べます。

<?php
echo "\e[31;41m". "hogehoge". "\e[m";
echo "\033[31;41m". "hogehoge". "\033[m";

 
上記のコードは赤い長方形が表示されるだけで文字が見えませんが、目的は達しています。

さらに小技でいうと、下線を引いたり、太字にしたり、文字色と背景色を反転したり、点滅させたりする事も、この設定からできます。

<?php
echo "\e[31;1m". "hogehoge". "\e[m";        // 赤い太字で表示
echo "\e[31;42;1m". "hogehoge". "\e[m";     // 赤い太字を緑の背景で表示
echo "\e[7m". "hogehoge". "\e[m";           // 文字色と背景色を反転して表示

 
反転などは、利用しても目がチカチカしにくいので単独で使用してもいいですね。

 

特定のコードだけサッとチェックしたい時に使うコマンドオプション

コンソールツールを作っていると、ふと実行結果がどんな形で返ってくるのか、だとか
この書き方でエラーにならないかとか、小さな疑問が湧いてくる事があると思いますが
そんな時にサッと試せるPHPオプション「 -r 」を紹介します。

例えば、パーミッションの変更をしたいとします。
chmod関数でサッと変更できる訳ですが、うまくいくか試してみたい場合、わざわざテストコードを書くまでもなく、コマンドに直接PHPコードを書けますよ、というオプションです。
PHPの開始タグである、「<?php」も必要ないあたりが僕のお気に入りポイントです。

php -r "chmod('/path/to/hoge', 777)"

# lsコマンドで結果がすぐに分かる!

 
イメージとしては、chmod 777 /path/to/hoge のような雰囲気で書いたつもりですが、実際パーミッションの変更はされません。
どこがおかしいのか、ドキュメントを読んだり、トライアンドエラーを繰り返して正解を探す訳ですが

ファイルの書き換え → 保存 → コンソールに移動 → phpファイルの実行 → (´・ω・`)

という流れを何度も繰り返すのは正直辛いので、上の例のように抜き出して簡単にテストができるようなところであれば、コマンドラインからやった方が手数が少なくていいかと思います。

 
以上です。


この記事をかいた人

About the author