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

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

Avatar for Hideo Kashioka Hideo Kashioka
April 12, 2025
47

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

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

Avatar for Hideo Kashioka

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