Mac OS X+PHPでオールインワン環境

堪能編 ネイティブMacアプリをPHPで操作しよう

繁田 卓二
株式会社 qnote

2008/6/29

PHPからiTunesのライブラリファイルをパースする

 では、コマンドラインインターフェイスを使用したサンプルとして、iTunesの曲リストを集計し、ジャンルごとの統計をターミナル上に表示するコマンドを作成してみましょう。

 iTunesのライブラリファイルは、ユーザーのホームディレクトリ下の、./Music/iTunes/iTunes Music Library.xmlです。拡張子からも分かるように、XML形式のファイルですが、やや特殊な形式ですので、今回は下記のURLで提供されている「iTunes XML PHP Parser」を使用します。

関連リンク:
リンク Code Triangle :: iTunes XML Parser for PHP
http://codetriangle.com/products/iTunesXmlParser/

 このパーサクラスを使用すると、iTunesライブラリのXMLファイルを解析した結果がPHPの連想配列で返されます。今回は、曲データの「ジャンル」ごとに曲数をカウントし出力しますので、全配列をループして「Genre」をキーとする要素をジャンル名として取得し、結果配列にジャンル名をキーとした要素の数値をインクリメントしてカウントしています。

●itunes-analyze.php
#!/usr/bin/php
<?php
include 'itunes_xml_parser_php5.php';

// iTunesライブラリファイルをパース
$iTunesLibraryXML = '/Users/shigeta/Music/iTunes/iTunes Music Library.xml';
$library = iTunesXmlParser($iTunesLibraryXML);

// パース結果をジャンルごとにカウント
$result = array();
foreach ($library as $music) {
    $genre = strlen($music['Genre']) ? $music['Genre'] : 'その他';
    if (!array_key_exists($genre, $result)) {
        $result[$genre] = 0;
    }
    $result[$genre]++;
}
ksort($result);

// 出力処理
print "iTunes ライブラリの統計\n";
foreach ($result as $_genre => $_count) {
    print "{$_genre}: {$_count}\n";
}
print "-----------------------------\n";
printf("合計: %d\n", array_sum($result));

?>

 このスクリプトファイルitunes-analyze.phpとパーサクラスitunes_xml_parser_php5.phpファイルを同じディレクトリに配置し、itunes-analyze.phpに実行権限を付与して実行すると結果が出力されます。

$ chmod +x itunes-analyze.php ……実行権限付与
$ ./itunes-analyze.php
iTunes ライブラリのジャンル統計

Folk: 33
J-Pop: 34
Podcast: 1
Pop: 166
Rock: 96
その他: 24
-----------------------------
合計: 357

 CLI版PHPといっても、このように出力するデータがHTMLかそうでないかといった違いのみで、基本的にはPHPの記述、文法に大きな違いはなく、これまで経験してきた知識をそのまま活用できるのです。

PHPからMac OS Xの外部コマンドを実行する

 クライアントサイドアプリケーションの実行環境は何も文字端末に限った話ではありません。外部のプログラムを呼び出したり、外部プロセスへ情報をプッシュするなどの手段を使えば、よりリッチなインターフェイスを実現できます。

 ここからはクライアントサイドPHPの特色を生かし、PHP開発に役立つツールを作ってみましょう。デバッグ中のエラーをトリガーとして、外部プログラムを起動し、エラーを通知するツールです。

 PHPから外部コマンドを実行するにはexec()関数やsystem()関数を取得します。単純に外部プログラムを実行するだけでなく、標準入出力経由でメッセージをやり取りすることも可能です。このあたりはMacやPHP特有の仕様ではなく、LinuxでもWindowsでも差異はありません。

 ではMac OS X特有の外部コマンドをPHPから呼び出してみましょう。Mac OS Xではsayというコマンドが実装されており、引数で渡した文字列を指定の声のパターンで読み上げる機能があります。sayコマンドは引数に文字列を渡すだけで、文章を読み上げてくれます。まずはこのコマンドをターミナルで実行してみましょう。

$ say "I bought a new MacBook Pro! "

 -vオプションで人名を指定すれば、声色を変更することも可能です。

$ say -v Kathy "I bought a new MacBook Pro! "

 このコマンドをプログラムから呼び出してみましょう。exec()関数の引数にコマンドを渡すだけです。

<?php

exec('say "I bought a new MacBook Pro! "');

?>

 このコマンドを活用して、PHPでエラーが発生したときにエラーメッセージを声に出して読み上げるエラーハンドラを作ってみましょう。sayコマンドは英文しか対応していませんが、PHPのエラーは幸いにもすべて英文であるため、sayコマンドで読み上げるのに問題はありません。

 PHPでは、エラーが起きたタイミングで指定のユーザー関数をコールするエラーハンドラという機構があります。これを利用して、エラーがあったタイミングでsayコマンドを実行する関数をコールさせます。エラーハンドラは、set_error_handler()関数に、エラー処理を記述した関数の名前を文字列で渡せば、エラー発生時にそのエラー処理関数を実行します。

 PHPのエラー機構はエラー発生時にこのコールバック関数にいくつかの情報を引数経由で渡します。順に、(1)エラーレベル、(2)エラーメッセージ、(3)ファイル名、(4)行数の4つです。通常はこの4つのなかから必要な情報を、ログや画面に出力します。今回は、エラーメッセージだけをsayコマンドに渡しています。

●SayErrorHandler.php
<?php

/**
 * 音声読み上げエラーハンドラ
 */
function say_error_handler($level, $msg, $file, $line)
{
    if ($level !== E_STRICT && $level !== E_NOTICE) {
        $cmd = sprintf("say %s > /dev/null 2>&1 &",
                       escapeshellarg($msg));
        exec($cmd);
    }
}
// エラーハンドラとして登録
set_error_handler('say_error_handler');

?>

 大量ループなどで厳格なエラーレベルE_STRICTとE_NOTICEが発生すると非常にうるさいので、エラーハンドラ内で無視しています。

 この関数は、あくまでもデバッグや開発において使用すべきです。sayコマンドがない環境で実行しようとするとエラーとなりますので、ソースコード中に実装すべきではありません。

 開発中のファイルとリリース時のファイルで記述を書き換えるのは面倒なので、設定ファイルphp.iniのauto_prepend_fileを設定することで解決しましょう。auto_prepend_fileで指定されたファイルは、PHPの実行時にあらかじめインクルードされます。この設定の記述を開発環境の設定ファイルphp.iniや、.htaccessなどに記述すれば、アプリケーション側のコードを環境によって書き換える必要はなくなります。

●php.iniに書く場合
auto_prepend_file = /Users/shigeta/src/SayErrorHandler.php
●.htaccessに書く場合
php_value auto_prepend_file /Users/shigeta/src/SayErrorHandler.php


prev
2/3
next

Index
ネイティブMacアプリをPHPで操作しよう
  Page1
クライアントサイド言語としてのPHP
シェルスクリプトとしてのPHP
Page2
PHPからiTunesのライブラリファイルをパースする
PHPからMac OS Xの外部コマンドを実行する
  Page3
PHPからファイルやフォルダを開く
Growlを使ってPHPからデスクトップにメッセージ通知

index Mac OS X+PHPでオールインワン環境

 Mac OS X関連記事
プログラマーを引き付けるMac OS Xの魅力
続々移行するそのワケとは
 Mac一筋という熱狂的なユーザーだけでなく、「面白いことをしたい」と考えるエンジニアもMac OS Xを利用し始めている。いったいなぜだろう
Mac OS XでAMP構築
3通りの方法で整備できる開発環境
 Mac OS Xの上にWebアプリケーションの定番、AMP(Apache+MySQL+PHP)環境を3通りの方法で導入してみましょう
Mac OS Xで動かす軽量プログラミング言語
導入からPHP拡張モジュール組み込みまで
 Leopardでは、インストール直後からいくつかの軽量プログラミング言語が利用できます。早速試してみませんか?
Objective-Cは特殊な言語?
Cocoaの素、Objective-Cを知ろう(1)
 iPhone用アプリケーション開発で注目を集める言語「Objective-C」。C++とは異なるC言語の拡張を目指したこの言語の基本を理解しよう
Mac内にPHP4、5、6を同居させるコツ
Mac OS X+PHPでオールインワン環境(インストール編)
 PHP4の開発は終了したが、移行の問題は残されている。異なるバージョンのPHPをスムーズに切り替えるには?
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間