Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP CLIを使って日々の業務を楽に

Hideo Kashioka
April 12, 2025
20

PHP CLIを使って日々の業務を楽に

PHPカンファレンス小田原のスポンサーLTの資料です。

Hideo Kashioka

April 12, 2025
Tweet

Transcript

  1. WordPressのwpコマンド wp post create --post_title="新規投稿" --post_content="内容" wp plugin install woocommerce

    --activate Drupalのdrush drush pm:install views drush cr PHPUnitによるテスト実行 phpunit tests/ 6
  2. wp、drush、phpunitもPHP CLI これらのツールはすべてPHPで書かれたCLIアプリケーションです: 実行方法 シェバン( #!/usr/bin/env php )が記述されているため、直接実行可能 php コマンドを明示的に指定する必要がない

    配布形式 PHAR(PHP Archive)ファイルとして配布 実行時にPHPインタープリターで解釈される これにより、PHPの機能を活用しながら、シェルスクリプトのよう に簡単に実行できるツールとなっています。 7
  3. ケース 1: CSVファイルに対して処理を行う [Bash版]のサンプル data.csvの合算 id,amount 1,300 2,450 3,250 tail

    -n +2 data.csv | awk -F',' '{sum+=$2} END {print sum}' ポイント: ヘッダー行(1行目)を除去するために tail -n +2 を使用 その後、awk でカンマ区切り (-F',') の2列目を加算 9
  4. [PHP版] <?php $data = array_map('str_getcsv', file('data.csv')); // 先頭行(ヘッダー)を削除 array_shift($data); //

    2列目(index=1)の値を抽出し、合計を算出 $sum = array_sum(array_column($data, 1)); echo "合計: $sum\n"; PHPの利点: ヘッダーの除去が明示的(array_shift) array_column と array_sum で直感的に合計計算が可能 10
  5. [Bash版] # sed を使用して、全ての <...> タグを削除する sed 's/<[^>]*>//g' sample.html ポイント:

    単純な正規表現のため、入れ子構造や複雑な属性には対応しにくい 12
  6. [PHP版] <?php // HTMLファイルを全体読み込みし、strip_tags() で全てのHTMLタグを除去 $content = file_get_contents('sample.html'); $text =

    strip_tags($content); echo $text; ?> PHPの利点: 内蔵関数 strip_tags() で安定したタグ除去が可能 13
  7. ケース 3:次の金曜日の日付取得 Linux (GNU date) # Linux (GNU date) なら

    "next Friday" で取得可能 date -d 'next Friday' +%Y-%m-%d macOS (BSD date) # macOS では書式が異なるため、例として 1週間後の金曜日を取得 date -v+1w -vFri +%Y-%m-%d ポイント: 同じ「次の金曜日」を取得しても、OSごとに書き方が異なり、保守が困難 14
  8. [PHP版] <?php // DateTime クラスと自然言語指定により、次の金曜日を簡単に取得 $nextFriday = new DateTime('next Friday');

    echo "次の金曜日: " . $nextFriday->format('Y-m-d') . "\n"; ?> PHPの利点: OS依存がなく、自然言語で記述できるためシンプル 15
  9. [シェルスクリプト版] 1. 純粋なシェルスクリプトでの実装 #!/bin/bash # XMLファイルを1行ずつ読み込み、タグを除去 while IFS= read -r

    line; do # タグを除去(単純な正規表現) text=$(echo "$line" | sed 's/<[^>]*>//g') # nameタグとpriceタグの内容を抽出 if [[ $text =~ \<name\>(.*)\</name\> ]]; then name="${BASH_REMATCH[1]}" fi if [[ $text =~ \<price\>(.*)\</price\> ]]; then price="${BASH_REMATCH[1]}" fi # 両方の値が取得できたらJSONに追加 if [ ! -z "$name" ] && [ ! -z "$price" ]; then items+="{\"name\":\"$name\",\"price\":$price}," name="" price="" fi done < data.xml # JSON配列を完成 json="[${items%,}]" # APIにPOST curl -X POST \ -H "Content-Type: application/json" \ -d "$json" \ 17
  10. [PHP版] <?php // XMLファイルを読み込み、SimpleXMLでパースする $xml = simplexml_load_file('data.xml'); $items = [];

    // 各アイテムを連想配列へ変換 foreach ($xml->item as $item) { $items[] = [ 'name' => (string)$item->name, 'price' => (int)$item->price, ]; } // APIエンドポイントにJSON形式でデータをPOSTする $apiEndpoint = 'https://api.example.com/addItem'; $data = json_encode($items); $options = [ 'http' => [ 'method' => 'POST', 'header' => "Content-Type: application/json\r\n" . "Content-Length: " . strlen($data) . "\r\n", 'content' => $data, ], ]; $response = file_get_contents($apiEndpoint, false, stream_context_create($options)); echo "API Response: $response\n"; 18
  11. 25