PHPはウェブアプリケーション開発の主役として長年君臨していますが、その真価はサーバーサイドのスクリプト作成だけに留まりません。
コマンドラインインターフェース(CLI)を活用した「ワンライナー」を使いこなすことで、日々の開発業務やサーバー管理の効率を劇的に向上させることが可能です。
ワンライナーとは、その名の通り「1行のコマンド」で特定の処理を完結させる手法を指します。
複雑なスクリプトファイルを作成することなく、ターミナル上で即座に実行できるため、データの加工や設定の確認において非常に強力な武器となります。
本記事では、PHPワンライナーの基本から、現場で即戦力として使える実用的な具体例までを詳しく解説します。
PHPワンライナーの基本構造と実行方法
PHPをコマンドラインから実行するためには、基本的にphpコマンドを使用します。
ワンライナーとして実行する場合、最も重要になるのが「-r」オプションです。
このオプションを使用することで、PHPのコードをファイルに保存することなく、引数として渡した文字列をそのまま実行できます。
まずは、最もシンプルな実行例を確認してみましょう。
// 文字列を出力するだけのシンプルなワンライナー
php -r 'echo "Hello, PHP One-liner!\n";'
Hello, PHP One-liner!
上記の例では、シングルクォーテーションで囲まれた部分がPHPのプログラムとして解釈されます。
文末にセミコロンが必要である点や、出力に改行を含めるために\nを使用している点に注目してください。
PHPのワンライナーでは、開始タグである「<?php」を記述する必要はありません。
これは、-rオプションがすでにPHPコードとしての実行を前提としているためです。
また、複数の命令を1行に記述したい場合は、通常のPHPプログラムと同様にセミコロンで区切ります。
// 複数の処理を連続して実行する
php -r '$name = "Developer"; echo "Welcome, " . $name . "\n";'
Welcome, Developer
このように、変数の定義や文字列の連結も自由に行うことができます。
よく使われるコマンドラインオプション
PHPワンライナーを使いこなすためには、-r以外のオプションについても理解を深めておく必要があります。
使用頻度の高いオプションを以下の表にまとめました。
| オプション | 説明 |
|---|---|
| -r | PHPコードを直接実行します。 |
| -a | 対話シェル(Interactive shell)を起動します。 |
| -v | PHPのバージョン情報を表示します。 |
| -m | コンパイル済みのモジュール一覧を表示します。 |
| -i | phpinfo()の内容をテキスト形式で出力します。 |
| -S | ビルトインウェブサーバーを起動します。 |
これらのオプションを組み合わせることで、PHPの実行環境を素早く調査することも可能です。
例えば、特定の拡張モジュールがインストールされているか確認したい場合は、以下のように記述します。
// mbstringモジュールの有無を確認する
php -m | grep mbstring
mbstring
このように、Linuxの標準的なコマンド(grepなど)とPHPのオプションを組み合わせることで、調査の効率が飛躍的に高まります。
実戦で役立つテキスト処理とフィルタリング
PHPワンライナーが最も威力を発揮する場面の一つが、テキストデータの加工です。
シェルスクリプトやsed、awkなどでも可能ですが、PHPに慣れている開発者にとっては、使い慣れた関数を利用できる点が大きなメリットとなります。
標準入力からのデータ読み込み
ワンライナーで外部からのデータを受け取るには、STDIN(標準入力)を利用します。
以下の例は、他のコマンドの結果をPHPで受け取り、加工して出力する流れを示しています。
// 標準入力を大文字に変換して出力する
echo "hello world" | php -r 'echo strtoupper(fgets(STDIN));'
HELLO WORLD
fgets(STDIN)を使うことで、パイプ経由で渡されたテキストを1行ずつ処理できます。
複数行のデータを一括で処理する
ファイルの全内容を一度に読み込んで処理したい場合は、file_get_contents('php://stdin')が便利です。
例えば、ログファイルの中から特定のキーワードを含む行の数をカウントする場合を考えてみましょう。
// ログファイル内の「ERROR」という文字列の出現回数を数える
cat access.log | php -r '$content = file_get_contents("php://stdin"); echo substr_count($content, "ERROR") . "\n";'
このように、PHPの豊富な文字列操作関数をそのまま使えるため、複雑な正規表現や条件分岐が必要な場合でも柔軟に対応できます。
正規表現による抽出と置換
PHPの強力な正規表現エンジン(PCRE)をワンライナーで活用する例を紹介します。
特定の形式を持つデータ(例えばメールアドレスやIPアドレス)を抽出する際に役立ちます。
// テキストからメールアドレスっぽい部分だけを抽出する
echo "Contact us at support@example.com or info@test.jp" | php -r 'preg_match_all("/[\w\.-]+@[\w\.-]+/", file_get_contents("php://stdin"), $m); echo implode("\n", $m[0]) . "\n";'
support@example.com
info@test.jp
複雑な文字列置換が必要な際も、preg_replaceをワンライナーに組み込むことで、ファイル全体のフォーマットを一括変換できます。
JSONデータの整形と変換
モダンな開発現場において、JSONデータの扱いは避けて通れません。
APIのレスポンスを確認する際や、設定ファイルを書き換える際にPHPワンライナーは非常に重宝します。
JSONを読みやすく整形(Pretty Print)する
一行に固まったJSONデータを、人間が読みやすい形式に整形する方法です。
// JSONを整形して出力する
echo \'{"id":1,"name":"Taro","tags":["php","cli"]}\' | php -r 'echo json_encode(json_decode(fgets(STDIN)), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";'
{
"id": 1,
"name": "Taro",
"tags": [
"php",
"cli"
]
}
JSON_PRETTY_PRINTを指定することで、インデントが挿入され、構造が把握しやすくなります。
また、JSON_UNESCAPED_UNICODEを併用することで、日本語がエスケープされずに表示されるため、デバッグがスムーズに進みます。
JSONから特定の値を抽出する
膨大なJSONデータの中から、特定のキーに紐づく値だけを取り出したい場合も、PHPなら簡単に記述できます。
// JSONの特定の要素にアクセスする
echo \'{"status":"success","data":{"user_id":123}}\' | php -r '$d = json_decode(fgets(STDIN), true); echo $d["data"]["user_id"] . "\n";'
123
json_decodeの第二引数にtrueを渡すことで連想配列として扱えるため、階層の深いデータへのアクセスも容易です。
ファイル操作とシステム管理の実用例
PHPワンライナーは、ファイルシステムに対する操作も得意としています。
複数のファイルに対して一括処理を行いたい場合などに便利です。
ファイル一覧の取得とフィルタリング
特定の拡張子を持つファイルだけを表示し、そのサイズを合計するような処理も1行で書けます。
// カレントディレクトリのPHPファイルの合計サイズを計算する
php -r '$s=0; foreach(glob("*.php") as $f) $s+=filesize($f); echo $s . " bytes\n";'
glob関数を使用することで、ワイルドカードを用いたファイル検索が簡単に行えます。
これはシェルスクリプトでループを書くよりも、PHPに慣れたエンジニアにとっては直感的かもしれません。
ランダムな文字列の生成(パスワード生成など)
開発中にテスト用のトークンや一時的なパスワードが必要になった際、PHPの標準関数を使えば安全に生成できます。
// 16進数のランダムなトークンを生成する
php -r 'echo bin2hex(random_bytes(16)) . "\n";'
a1b2c3d4e5f6... (32文字のランダムな文字列)
random_bytesは暗号学的に強い疑似乱数を生成するため、セキュリティが重要な場面でも安心して利用できます。
日付や時間の計算
特定の日時のタイムスタンプを知りたいときや、1週間後の日付を確認したいときにもPHPは便利です。
// 1週間後の日付を表示する
php -r 'echo date("Y-m-d", strtotime("+1 week")) . "\n";'
strtotime関数の柔軟な解析能力をワンライナーで活用することで、複雑な日付計算を瞬時に行えます。
開発効率を最大化するデバッグ術
PHPワンライナーは、実行環境の差異を確認する際にも威力を発揮します。
サーバーごとに異なる設定値を把握することは、トラブルシューティングにおいて不可欠です。
PHP設定値(php.ini)の確認
特定のディレクティブがどのように設定されているか、-iオプションとgrepを組み合わせて確認します。
// メモリ制限の設定を確認する
php -i | grep memory_limit
memory_limit => 128M => 128M
わざわざphpinfo()を表示させるためのPHPファイルを作成してブラウザで確認する手間が省けます。
インクルードパスの確認
ライブラリが正しく読み込まれない原因を探る際に、インクルードパスを確認することがあります。
// include_pathを表示する
php -r 'echo get_include_path() . "\n";'
このように、「今の環境でこの関数を実行したらどうなるか」を即座に試せるのがワンライナーの強みです。
配列の中身をクイックチェック
複雑な多次元配列の挙動を確認したいときは、print_rやvar_dumpを併用します。
// 範囲指定で生成した配列を確認する
php -r 'print_r(range(1, 10, 2));'
Array
(
[0] => 1
[1] => 3
[2] => 5
[3] => 7
[4] => 9
)
関数の挙動をドキュメントで調べるよりも、実際に動かしてみた方が早いケースは多々あります。
ワンライナーを書く際の注意点とベストプラクティス
非常に便利なPHPワンライナーですが、利用にあたってはいくつかの注意点があります。
正しく安全に使いこなすためのポイントを押さえておきましょう。
クォーテーションのエスケープ
ワンライナー全体をシングルクォーテーション(’)で囲む場合、その中でシングルクォーテーションを使用するには注意が必要です。
多くのシェルにおいて、シングルクォーテーション内でのエスケープは複雑になりがちです。
基本的には、外側をシングルクォーテーション、内側の文字列をダブルクォーテーションにするのが最も無難です。
// 正しい例
php -r 'echo "It is easy.";'
// 複雑になる例(シェルの種類によって挙動が変わる可能性がある)
php -r 'echo "It\'s difficult.";'
コードの可読性を捨てない
ワンライナーは1行で書くことが目的ですが、あまりに複雑になりすぎる場合は、おとなしくスクリプトファイルを作成すべきです。
「後で見返したときに意味がわかるか」という視点を忘れないようにしましょう。
もし何度も同じワンライナーを使うのであれば、シェルの「エイリアス」として登録しておくのも一つの手です。
// .bashrcなどに登録する例
alias phpsize='php -r "echo filesize(\$argv[1]) . PHP_EOL;"'
副作用のある処理に注意する
ファイル削除(unlink)やデータベースの操作を伴うワンライナーを実行する際は、細心の注意を払ってください。
コマンドを実行した瞬間に処理が行われるため、ミスをすると取り返しのつかないことになる可能性があります。
まずはechoなどで処理対象を確認してから、実際の実行コマンドに書き換えるといった慎重さが求められます。
まとめ
PHPワンライナーは、習得したその日から開発効率を劇的に変えてくれる強力なツールです。
-rオプションを起点として、テキスト処理、JSON加工、システム調査など、その活用範囲は多岐にわたります。
ウェブアプリケーションの開発だけでなく、「道具としてのPHP」を使いこなすことで、エンジニアとしての幅が大きく広がります。
まずは、日常的なちょっとした確認作業をワンライナーに置き換えることから始めてみてはいかがでしょうか。
使い慣れたPHPの関数が、ターミナル上でも強力な味方になってくれるはずです。
