初心者向け 8時間耐久CakePHP2勉強会を開催しました
1月 27, 2012 by yandod · Leave a Comment
追記)大阪でも2/5(日)に開催します!
http://atnd.org/events/24800
CakePHPを勉強したいという@shinichiNさんの要望に応えて8時間耐久でCakePHP2を学ぶという勉強会を1/25に下北沢OSSCafeで開催しました。当日はUStreamも常時30人前後の人が視聴しており、現地の参加者も含めて50人弱が耐久形式で最新のCakePHP2の利用方法を学びました。
なお今回のターゲットの@shinichiNさんはフレームワークなどは未経験とのことでしたので、WordPressを使ったり簡単なPHPスクリプトを自分で書けるくらいの人がCakePHPの基本を理解するというのが今回の主旨です。
MVCモデルとは牛皿定食である

フレームワークを使ったことが無い人にとって、とっつきにくいのがMVCモデルの考え方です。ModelがデータベースでViewがHTMLでという説明を聞いているとまるでこれまで作っていたプログラムとまったく違うものを作らないと行けない気がしてきます。しかし実際のところMVCモデルは大きくなったプログラムを分割する為の経験則です。牛丼を牛皿定食にしても内容物として肉、玉ねぎ、お米があることに変わりはないようにMVCモデルもこれまで作っていたプログラムを一定のルールに従って分割しただけです。
普通のPHPスクリプトの例で考えてみましょう。(クリックで拡大)

上記のスクリプトはなるべくシンプルにデータベースのデータを画面に表示するという普通のPHPスクリプトですが、このうちデータベースに関連する処理とHTMLに関連する処理を別の場所に移すというふうに考えます。(このスクリプトはDB処理とHTMLが一箇所にまとまるように書いてありますが、分散していた場合はそれぞれを抜き出して移動します)
DB処理をモデルにHTMLをビューに移してみました。そしてそれでも残った元々の部分がコントローラーになり、モデルとビューを呼び出しています。スクリプトの内容は分割してincludeで呼び出すようにしただけで全く同一です。こういったものが独自フレームワークと呼ばれCakePHPが一般的になる前からも大きなシステムでは活用されていました。また自分流でスクリプトを書いているとなんだかんだでこういった形を使うようになってきます。
フレームワークを使う場合は各フレームワークごとに決められた場所にMVCのそれぞれの部分を配置することになります。CakePHPの場合であれば下記のような形です。
CakePHP2インストールの肝はPDOとmod_rewriteの確認
CakePHP2はCakePHP1やWordPressなどと違ってPDOというPHPの機能を使っています。インストールの際にはPDOが利用できることをphpinfo()で確認します。またXAMPPやMAMPPでは初期状態ではmod_rewriteが有効になっていません。mod_rewriteを有効にするか、core.phpのAPP.BaseUrlの設定を有効にしてください。
またYukio SaitohさんがWindowsの場合の設定のポイントをまとめて下さいました!
Controller:: ディスパッチャを理解せよ
多くのフレームワークは指定されたURLに応じた所定のコントローラーを呼び出すという機構を採用しています。これをCakePHPではディスパッチャーが行なっており、指定されたURLに応じたコントローラーのメソッドを呼び出します。作ったコントローラーを呼び出す為のURLを考えたり、とあるURLに対応するコントローラーをどうすれば作れるのかを理解すれば自分で作った処理を自由に呼び出せるようになります。
この際に命名規則に従う必要もありません。$usesやアクションの設定を省略した場合は命名規則に従ったデフォルトが呼び出されるだけですので。きちんと指定をすれば自由に名前をつけられます。
Model:: find()を極めろ
CakePHPはモデルの機能が中心といってもよいフレームワークです特にfind()メソッドを使えばほとんど全てのケースのデータベース処理を自動化できます。このfind()に慣れれば慣れるほどにCakePHPでの開発がスムーズになります。
またこのfind()が返却する結果と要求するオプションは大きな配列変数になっています。
配列に依存しすぎという批判もありますが、とにかくえいやと配列を渡すとうりゃっと配列が返ってくるのがCakePHP流なのでそれに慣れるのが早道です。(そもそもPHP自体が配列中心なところがあるので僕はこの設計は成功していると思っています。)
View:: URLやフォームはヘルパーで自動生成せよ
ビューに関しては app/View/Layouts/default.ctpを変更してヘッダ、フッタなどを変更する事と、ヘルパーを利用したタグの自動生成くらいしか覚えることはありません。とりあえずはヘッダなどを任意のデザインに差し替えて、テンプレート内にURLを書くようなタグでヘルパーを使うところから始めればよいでしょう。
お疲れ様でした
実際にはいろいろとデモンストレーションや質疑応答をしながらの8時間の勉強会でしたが、多くの方がCakePHPを好きなように動かせました。(ソースコードを一字一句書き写すのではなく、好きな名前をつけたりしながら各自が確認をしていました)細かいことを詳細に確認するのも大事ですが、まずは全体像を掴んでいじり回せるようになる事が第一歩かと思います。
今回は下北沢OSSCafeという素晴らしい環境で、なおかつ@cognitomさんのハイクオリティUStreamの録画が残っています。動画を全画面表示するとソースコードすら確認できる脅威のクオリティをご堪能ください。(残念ながら午前中のところは録画がありません)
8時間耐久CakePHP(1/4) – Controller編
8時間耐久CakePHP(2/4) – Model編
8時間耐久CakePHP(3/4) – Model編の続き
8時間耐久CakePHP(4/4) – View編
デモで使っていたプロジェクトはとりあえずgithubに置きました。
https://github.com/yandod/shimokita8
同様の勉強会を大阪と福岡でやろうかなと思っています。他にも開催の要望があれば場所さえあればなんとかなりますのでご相談ください。
ダッシュボードからプラグインのインストールが可能に – CandyCane v0.8.5リリース
CandyCaneダウンロード
(ページ下部にZipとtar.gzの圧縮ファイルへのリンクがあります)
RedmineをPHPに移植したタスク管理システム、CandyCaneのバージョンが0.8.5になりました。一部で話題になったにゃーんダウンチャートを生んだプラグイン機構を改良し、プラグインのインストールとアンインストールがダッシュボードから出来るようになりました。またプラグインのひな形を生成するシェルコマンドも同梱され、プラグインの開発をすぐに始める事ができます。
今回は作例としてチケットに「イイね」の機能を付けるLike Itプラグインを作成してみました。CakePHPベースでの開発はやはり効率がよくかなり少ないコードの分量で機能を実装する事ができたと思います。このプラグインのデモ動画はこちらです。
プラグインのカタログはgist上で管理しています。みなさんが作成したプラグインもgithubで公開されていればカタログに追加する事でダッシュボードからの配布が可能になります。ガントチャートのような独立性の高い機能については是非ともプラグインとして実装された事例が出てくればと思います。また僕自身が公開しているプラグインもそうですが、ネタっぽいものでも作ってみると勉強になるのでCakePHPの学習題材としても良いのではと思います。
開発にかかった時間は25時間。また今回から@okonomiさんが送ってくださったプルリクエストも含まれています。
- Bug #207: Supporting plugin architecture. Part3
- Bug #208: Kindly notice mod_rewrite availability.
- Bug #209: list is broken on render if it has more than 3items.
- Bug #211: Plugin generation by console.
- Bug #214: 「トラッカー」画面でワークフロー未設定のエラーメッセージが表示されない
- Enhancement #185: “Like” feature for issue.
- Enhancement #210: Get plugin catalog from remote.
まだバグつぶしや実現できていない構想もありますが、プラグイン機構で自由に機能を追加しやすい土壌が整ってきました。機能だけでなくデザインなどについても自由に組み替えて利用できるようなシステムにしていければよいなと思います。インストールも簡単ですので、お時間のある方はインストールの上でいじってみたり、プラグインを作ってみて貰えれば大変嬉しいです。
最近の反響
2011年を振り返る(206投稿,176コミット,8プレゼンテーション)
12月 31, 2011 by yandod · Leave a Comment
激動の2011年が終っていきます。Nyan CatをBGMに今年の活動を振り返ってみようと思います。
ブログ記事
今年は新たに英語の情報を紹介するA-Listersというブログを立ち上げ、このブログと英語版のブログと併せてかなりたくさんのブログ記事を書いた一年になりました。それぞれのブログに投稿した記事数をせっかくなので数えてみます。
- A-Listers 119
- candycane development 47
- CandyCane yet another Redmine on CakePHP 5
- 個人の英語ブログ 35
合計で206本。こんなに書いたのは初めてです。ただ夏頃に体調を崩したのでここまで書くと健康を害するようなのであまりお勧めできません。
オープンソース活動
今年はCandyCaneに大きな手応えを感じる事が出来た一年でした。さまざまな国からプルリクエストや感想などが届きはじめ、業務で利用しているという話も多く聞きます。思い描いていた機能を実現するまで後少しなのでこのまま頑張って行きたいですね。また、「CandyCaneで起業すればいいじゃん」というアドバイスも国内外から受けています。これについても思案中です。
githubでのコミット数はcandycaneとにゃーんダウンチャートのリポジトリの合計で176コミットでした。どうしても私生活が忙しい時などは引っ張られてしまいますね。
candycane$ git shortlog -sn 43690c..06ed
118 Yusuke Ando
88 Graham Weldon
46 yandod
13 ha1t
3 elboletaire
3 Steve Grosbois
3 Michito Suzuki
2 Òscar Casajuana
1 hiromi2424
1 tomo
cc_nyancat$ git shortlog -sn
13 Yusuke Andoプレゼンテーション

プレゼンテーションの活動についてはCandyCaneの発表を中心に8回行いました。特に今年はイギリスで行われたCakeFestでの発表に採択されたおかげで初めて海外のイベントで発表する機会を得たのが良かったです。英語的には反省点はいくらでもありますが、発表した事によって世界中からフィードバックを得る事が出来たので成功したと思っています。とはいえもっとスムースに話せるようになりたいので英語の練習はまだまだ欠かせないです。
発表の後に得たフィードバックについては何本か記事を書いて多くの方に読んでもらえました。
CakeFest 2011に参加しました。
CandyCaneの発表で感じた発信と恩返しの大切さ
プログラマがコードを書き、公開する事の価値
とにかくアウトプットが大事
日本では震災の影響や海外進出が身近になったことでいろいろと日本のスタイルに対して物を言う空気が出来て来たように思います。自分自身も思う所はありますが、そういった事に対して議論をしているだけで労力を使うよりは自分が理想だと思う事を実行に移して、アウトプットを出して行く方が良いのではと思っています。
来年も引き続きアウトプットを意識して自分が良いと思った事を実行に移す一年にできればよいなと思います。
各地、各方面でお会いした皆様やオンラインでやりとりした皆様には大変お世話になりました。来年も宜しくお願い致します。
昨年の振り返り記事
2010年を振り返る
Windows Azure + PHPな環境でSymfonyを動かす #symfonyadvent
12月 22, 2011 by yandod · Leave a Comment
このエントリーはSymfonyアドベントカレンダー2011に参加しています。CakePHPの人として知られている私ですがSymfonyも業務では4年以上利用し続けております。今回は22日目担当とWindows Azure + PHPの環境でSymfonyを動かしてみました。いろいろと面倒なところがありそうな予感もしますが、これまでの知識を元に公式のチュートリアルを動かす事を目標にやってみます。
SQLite拡張の有効化

ではWindws Azure PHPプロジェクトを新規に作成し、Symfony2.0.7をダウンロードしたものをソースに取込んで動かしてみます。画面のようにSQLiteの拡張が見つからないというメッセージが表示されます。Azure SDKに同梱されたPHPではSQLiteが有効になっていなかったので、php/php.ini 内のコメントを外し、SQLiteを有効にします。

これでフレームワーク部分は動作していますので、デモ用のバンドルに含まれている画面などは上記のように動作しています。
データベースの接続設定

SQLiteを有効にした事で開発用のブートストラップからダッシュボードにアクセスできます。ここからデータベースの接続設定をしていきますが、残念ながらここにはMySQLやPDO_MSSqlといった選択肢しかありません。もちろんMySQLなどをAzureで動作させればここから設定をすれば問題はありません。とはいえせっかくAzureですからAzureSQLに接続して動かしたいですよね。
AzureSQLに接続するにはmicrosoftから配布されているsqlsrv拡張を導入する必要があります。Azureプロジェクトに同梱されているバージョンに併せた拡張をプロジェクト内にコピーして、これもphp.iniから正しく読み込まれるように設定します。
extension="php_azure.dll" extension="php_mysql.dll" extension="php_sqlsrv_53_nts_vc9.dll" extension="php_pdo_sqlsrv_53_nts_vc9.dll"
またデータベースへの接続設定はダッシュボードからではなく直接設定ファイルを編集して設定します。
[parameters]
database_driver = pdo_sqlsrv
database_host = YOUR-PC\SQLEXPRESS
database_port =
database_name = symfony
database_user = sa
database_password = yourpasswordDoctrineの操作

ここまでの設定を行った事でDoctrine経由でのスキーマ操作等が行えます。シェルを実行した際には少しエラーが出てしまいますが、タスクの実行自体に問題はありません。ソースコードの変更を伴うようなタスクを実行した後はプロジェクトを開発ファブリックに再度反映する必要がある点には注意してください。
ここまでの動作確認は開発ファブリック上で行っています。このプロジェクトを本当にデプロイできるかどうかを試してみたいのは山々なのですが、残念ながらAzureのアカウントを持っていません。とはいえsqlsrv拡張を通じてAzure SQLにアクセスできる事は周知されているので問題ないと言って差し支えないでしょう。
にゃーんダウンチャートが使えます – CandyCane v0.8.4
RedmineをPHPに移植したCandyCaneのv0.8.4をリリースしました。 このリリースによりさまざまなプラグインを開発できるようになりました。完全なプロダクトを作るというのはかなり難しい目標です。そこでプラグインシステムを用意して必要な人が自分の好きな機能を追加できるというのが望ましいと考えていました。CandyCaneのプラグインはCakePHPの流儀で作成する事ができ、これによりプラグインを作ってみる方が増えてくればよいなと思っています。ではプラグインの概要を見てみましょう。
CandyCaneのプラグインの基礎
CandyCaneのプラグインはCakePHPのプラグインです。. CakePHPのMVCをベースにしたコードを書く事でCandyCaneにプラグインとして追加できます。また追加のコードからCandyCaneのモデルやヘルパー、コンポーネントなどを呼び出す事が出来ます。例えばチケットのデータやプロジェクトのデータをモデルから取得できます。作成したページがCandyCaneとやり取りをする為のAPIも用意されています。これらのAPIはプラグインの内部のinit.phpから呼び出します。
画面上部のメニューへのページ追加
アプリケーション全体のレベルのページを追加したい場合は画面左上のメニューにリンクを追加する事になるでしょう。リンクを追加するにはMenuContainerオブジェクトをプラグインの中のinit.phpから使います。
$menuContainer = ClassRegistry::getObject('MenuContainer'); $menuContainer->addTopMenu( array( 'url' => '/cc_nyancat/nyan/index', 'class' => 'nyan-cat', 'caption' => 'Nyan Cat', 'logged' => false, 'admin' => false ) );
プロジェクトタブへのページ追加
CandyCaneの多くのページはプロジェクト以下の要素として動作します。このようなページを作成する場合はページをプロジェクトタブに追加することになります。その場合はMenuContainerクラスを使います。また現在のプロジェクトをURLから推定する為のルーティングの設定が必要です。
$menuContainer->addProjectMenu( 'nyancat', array( 'plugin' => 'cc_nyancat', 'controller' => 'cc_nyancat_chart', 'action' => 'index', 'class' => '', 'caption' => 'Nyan Down Chart', 'params' => 'project_id', '_allowed' => true // for bypassing permmission system. ) ); // make sure put new route setting which includes project_id App::import('Core','Router'); Router::connect('/projects/:project_id/nyanchart/:action', array( 'plugin' => 'cc_nyancat', 'controller' => 'cc_nyancat_chart' ));
ページ内の特定の場所へのHTML挿入
CandyCaneの既存のページに変更を加えたい場合、テンプレートの構造を元に変更を加えられます。HookContainerクラスのオブジェクトを使って任意のテンプレートをフックできます。テンプレートが分離されているポイントに対しては好きなテンプレートを追加できます。例えばこの場合はNyan Catがissues/relationsテンプレートの後に表示されます。
$hookContainer = ClassRegistry::getObject('HookContainer'); $hookContainer->registerElementHook( 'issues/relations', // target element name. '../../plugins/cc_nyancat/views/elements/nyancat', // additional template you want to inject. false // it should be true when you want to inject before the target template. );
プラグインのインストール
プラグインのインストールには手動の作業が必要ですが、近いうちに自動化する予定です。とはいえ手順はapp/pluginsの下にプラグインを展開するだけです。CandyCaneのプラグインは”cc_”で始まるディレクトリで作成され、CandyCaneは”app/plugins/cc_*”配下のinit.phpを探してプラグインをロードしています。
実際の例を見るにはcc_nyancat plugin のgithub上のコードを動かしてみてください。みなさんが実際にプラグインを作成して面白い使い方ができるようになることを楽しみしています。
おまけ:各界の反応
CakePHPの大きなリリースの歴史を振り返る
12月 16, 2011 by yandod · Leave a Comment
ちょっと気になったのでCakePHPのメジャーなリリースのタイミングを振り返ってみます。
- 2005 プロジェクト開始
- CakePHP1.0 欠番?
- 2006/5 ? CakePHP1.1.3
- 2008/12/26 CakePHP1.2
- 2010/4/25 CakePHP1.3
- 2011/10/17 CakePHP2.0
CakePHP1.0って欠番?
CakePHPのコーディング規約違反をPHP_CodeSnifferでチェックする #CakephpAdvent2011
12月 2, 2011 by yandod · 3 Comments
この記事はCakePHP Advent Calendar 2011に参加しています。
記述したコードの表記ゆれを防ぐ為の手法としてコーディング規約があります。見通しが良く一貫性のあるスタイルで記述されたコードはメンテナンス性を維持する助けになり、コードレビューの際の不毛な論争を少し減らす手助けになります。今回はCakePHPでアプリケーションを開発する際にコーディング規約を適用する方法を検討してみます。
どのコーディング規約を適用するか
PHPではPEARのコーディング規約が一般的に知られていますが、PEARはライブラリという事もありこの規約をそのままアプリケーションの実装に適用するのは冗長かもしれません。また同様にZendフレームワークやSymfonyもコーディング規約を持っています。
CakePHPでアプリケーションを実装する場合を考えてみても、PEARのスタイルはCakePHPが採用しているスタイルを使うよりはフレームワークに合わせてCakePHPのスタイルを採用するのはそれなりに妥当なのではないでしょうか。
CakePHPのコーディング規約
CakePHPのコーディング規約については公式のドキュメント内に記述があります。
CakePHP1.3のドキュメント
http://book.cakephp.org/view/509/Coding-Standards
CakePHP2.0のドキュメント
http://book.cakephp.org/2.0/en/contributing/cakephp-coding-conventions.html
二つのドキュメントは体裁が異なっていますが内容は現時点で同一です。CakePHPのコーディング規約が定めている内容を下記の通りです。
- タブによるインデント
- 制御構文(if for foreach while switch)の記述
- 参考演算子
- 関数呼び出し
- メソッド定義
- コメント
- ファイルのインクルード
- PHPタグ
- 命名規約(関数 クラス メソッド 変数)
- アクセス修飾子
- メソッドチェーン
- サンプルのアドレス
- ファイル名
- 変数の型
- 定数
PHP_CodeSnifferの導入
コードが規約に沿って記述されているかをチェックするツールとしてはPHP_CodeSnifferが知られています。PEARで配布されているライブラリなのでインストールはPEARコマンドを使う事になります。標準のチャンネルからインストールできるパッケージなので1つのコマンドだけでインストールできます。
pear install PHP_CodeSniffer
インストールが完了すれば下記のコマンドでPHP_CodeSnifferが起動します。またインストール済みのコーディング規約のリストを確認もできます。
$ phpcs --version
PHP_CodeSniffer version 1.3.1 (stable) by Squiz Pty Ltd. (http://www.squiz.net)
$ phpcs -i
The installed coding standards are MySource, PEAR, PHPCS, Squiz and Zend
ご覧の通りPEARの規約などはインストールされていますが、CakePHP用の規約はインストールされていません。CakePHP用の規約は無いのかなとツイートしてみたところCakeのコアな開発者であるsavantさんがgithub上にでjrbassoさんが開発しているものを教えてくれました。他にもAD7sixさんがメンテナンスしているものもあるのですが、今回は最初のものを使ってみます。phpcsコマンドは任意のディレクトリに存在する規約を読み込む事もできますが、簡単に使うにはPEARのインストールディレクトリ配下の下記のパスにgithubから落としてきたコードを配置します。
PHP/CodeSniffer/Standards/
正常にインストールされていればphpcsコマンドから表示される規約の一覧にCakePHPが追加されているはずです。
$ phpcs -i
The installed coding standards are CakePHP, MySource, PEAR, PHPCS, Squiz and Zend
これで任意のディレクトリのソースをチェックできるようになりました。カレントディレクトリ以下のphpファイルを検査する場合は下記のようなコマンドでOKです。
phpcs --report=summary --report-checkstyle=CakePHP --standard=CakePHP --extensions=php ./
Jenkinsとの統合
CodeSnifferのチェックが出来るようになっても任意で実行するというのはいかにも忘れそうです。ここはモダンにJenkinsからコードを検査するようにすればコミット毎に規約をチェックしてさらにグラフなどを生成してみましょう。Jenkinsから実行する場合は下記のようなコマンドを設定してcheckstyle形式のレポートを生成します。これによりJeninsのcheckstyleプラグインからレポートを読み込んでグラフを生成できます。ただ標準のままですと1つでもエラーがあるとビルドが失敗にマークされてしまうので最後にidコマンドを実行して常にビルドは成功するようにしています。
phpcs --report=checkstyle --report-checkstyle=checkstyle.xml --standard=CakePHP --extensions=php ./ || id
生成されたグラフは下記のような感じです。いい感じですね。
-300x121.png)
githubなどでコードを公開する事が増えて来た昨今、コーディング規約に準拠した奇麗なソースを書きたいですね。PHP_CodeSnifferとJenkinsの統合を行えば自然とコードを奇麗に書く習慣がつきますので、まだ設定していない方は設定してみる事を強くお勧めします。
candycane v0.8.3 をリリースしました
12月 1, 2011 by yandod · Leave a Comment
RedmineをPHPに移植したチケット管理システム、CandyCaneのv0.8.3をリリースしました。今回のリリースではphpmatsuriでの成果とバグフィックスを含んでおり、これによりプラグインを用いてCandyCaneを拡張できるようになりました。
サンプルとしてNyan Catを表示するcc_nyancatプラグインを開発しました。このプラグインを導入するデモ動画があります。こちらの動画ではプラグインがサブディレクトリに配置するだけで有効になる様子をご覧になれます。
延べ作業時間は10時間、6のバグ修正と2つの機能追加です。
- Bug #65: チケットの移動時に関連削除処理でエラーがでる
- Bug #67: チケットを移動させると起票者が変わる
- Bug #75: ログインしていないのにニュースが編集できてしまう
- Bug #158: News module was spamed.
- Enhancement #159: Sending email on updating news.
- Bug #178: Users can’t Update issues
- Enhancement #186: Supporting plugin architecture. Part1
- Bug #190: Fix denial of permissions for users with permissions moving issues
イベントの開催などが一段落したので今後は開発に多くの時間を割けるようになりそうです。githubでのプルリクエストや実際に使ってみたなどのご報告も歓迎です。宜しくお願い致します。
Windows Azure + PHPな環境でAPCを使う(失敗編)
11月 30, 2011 by yandod · Leave a Comment
PHPの動作を高速化させる技術としてはAPCが知られています。スクリプトのコンパイル結果をキャッシュする事で構文解析をスキップすることができ、また任意のデータをキャッシュする事も出来る拡張モジュールです。今回はこのAPCをWindows Azure環境で導入を試みました。
拡張モジュールの入手
理由は不明ですが、APCの拡張モジュールはWindows版PHPにバンドルされていません。AzureのPHPはWindows版のPHPですから、やはり標準では含まれていません。とはいえWindows上でPHPの拡張をビルドするというのはなかなかチャレンジングです。いろいろと調べてみたところ下記のページでWindows用のAPCのバイナリが配布されていました。
http://downloads.php.net/pierre/
Azureに添付されているPHPに適合するのはVC9でビルドされたNon Thread Safeなバイナリですので該当するものをダウンロードして php/ext 以下にコピーし、php.iniからモジュールを読み込みます。
動作確認
さてphp.iniに設定を書きこんだのでphpinfo()にて読み込まれていることを確認してみます。
動作しているようです。がしかし、何度かリロードを繰り返すと、、、
クラッシュしてしまいました。このレベルでクラッシュしてしまうと前述した方法ではログが取れません。気になるのがAzureのローカルファイルに書き込めないという制限に対してAPCのWindows版についている注釈。
注意: Windows 版の APC では、temp パスが存在し、 Web サーバから書き込み可能になっていることが必要です。 APC は環境変数 TMP、TEMP、USERPROFILE の内容をこの順に調べ、 どれも設定されていない場合は WINDOWS ディレクトリを使用します。
該当の環境変数が指しているディレクトリを見てみると下記のような状態。
いくつかファイルは出来ていますがサイズが0です。どうにかしてこの状況を打開したい所ですがログが見れないという問題がある為、そこから考え直す必要がありそうです。現在の予想としてはファイルシステムがらみ(ロックとか)の問題が起きているかAPCとPHPの相性、スレッドセーフなどを疑っていますが果たして。。
Windows Azure + PHPな環境でDiagnosticsを使ってログを記録する
前回はとりあえずエラーの情報を画面に表示する設定をしてみましたが、今回はエラーの情報を記録できるように設定してみます。インスタンスの再起動の際にディスクの内容が初期化されるAzureではログの情報はAzure Storageに記録する事になります。
Azure 運用時の考慮点 | Tech Fielders コラム
Windows Azure のインスタンスにはローカルディスクが用意されていますが、ここに保存されたデータは再起動時にクリアされてしまいます。つまり、永続的なデータについては Azure ストレージの使用を検討し、コンピューティングに関してはあくまで計算やサービスの提供窓口としての機能しか持たせないようにすることをお勧めします。
Azure StorageにアクセスするAPIを使ってログを書く事もできますが、Azure StorageはRESTでアクセスするサービスになっているのでログを一行出力する度にAPIをコールするというような使い方は現実的ではありません。そこでAzureではログなどの情報をトラッキングする為のDiagnostics(診断)という機能を持っています。この機能を有効にする事で任意のログをローカル側で貯めながら随時同期するという仕組みを実現できます。このログの仕組みそのものについてはwaritohutsuさんのブログの記事が詳しいです。
Windows Azure ログ講座第一弾 ~Windows Azure logs~

上記の記事はC#での実装方法になっていますが、同様の挙動をPHPで試してみます。
Diagnosticsの設定と動作確認
Diagnosticsの設定を行うには新規にプロジェクトを作る際のウィザードの中で設定をするのが最も手軽です。ウィザードで設定した内容を元に各種設定が記述されています。既存のプロジェクトに設定を行う場合は、設定ファイルに該当の記述を追加する事でDiagnosticsを有効にすることができます。
まずはServiceDefinition.csdefのImport設定からDiagnosticsを読み込みます。何もImportしていない場合は開始タグと終了タグが存在していないので該当部分を置き換えてください。
<Imports> <Import moduleName="Diagnostics"/> </Imports>
次にServiceConfiguration.cscfg(関係する部分だけ抜粋しています)にログの転送設定などを記述します。今回は開発用ストレージを対象にした設定を記述していますが、クラウド環境のストレージを利用する場合は適切なアカウント情報などに置き換えてください。ログの転送頻度を表すScheduledTransferPeriodInSecondsに有効な値が設定されていないと記録されたログがストレージに転送されなくなるので特に注意が必要です。
<ConfigurationSettings> <Setting name="StorageAccountName" value="devstoreaccount1"/> <Setting name="StorageAccountKey" value="Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="/> <Setting name="UseDevelopmentStorage" value="true"/> <Setting name="LogLevel" value="Error"/> <Setting name="ScheduledTransferPeriodInSeconds" value="10"/> <Setting name="WindowsAzureStorageConnectionString" value="UseDevelopmentStorage=true"/> <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true"/> </ConfigurationSettings>
設定に文法エラーが無ければプロジェクトをパッケージして開発ファブリックにデプロイできるはずです。
PHPのエラーをDiagnosticsへ流し込む
では次にPHPからDiagnosticsに対してログ情報を送ってみます。PHPからAzure Logを記録するにはphp_azure.dllが提供するazure_log関数を使います。
azure_log(AZURE_LOG_CRITICAL,"This is error log.");
実行後にしばらく待つとログがWADLogsTableに記録されます。ログの情報の確認はAzure Storage Explorerが便利です。
次にこの関数を使ってPHPのエラーログをAzure Logに記録してみたいと思います。この為にはPHPのエラーハンドリング機構を使って自作したエラーハンドラーからazure_log関数を呼び出す形になります。これによりPHPから発せられた警告や任意にトリガーしたエラーを記録できるようになります。
function azure_log_handler($errno, $errstr, $errfile, $errline){ $string = sprintf("%s %s %s %s", $errno, $errstr, $errfile, $errline); azure_log(AZURE_LOG_CRITICAL, $string); return false; } set_error_handler("azure_log_handler",E_ALL); trigger_error("PHP ERROR");
ログのフォーマットはのちに検索する事なども考慮して使いやすそうなフォーマットにするとよいでしょう。
現存するライブラリについて
上記の方法では自前の実装でDiagnosticsを使っていますが、Azure向けの関数を活用するライブラリとしてWindows Azure SDK for PHPがあり、このライブラリにもDiagnosticsのクライアントが含まれています。このクライアントを使う事でパフォーマンスログなどをBlobオブジェクトで記録できます。このライブラリの活用方法については別の機会に紹介しようと思います。
Diagnosticsは設定を行ってもそれだけでは何も記録しません。ウィザードからとりあえず設定をしてみても何も起きていないので機能の存在に気がついていないケースもあるような気がします。なんらかの形でログを記録する処理を実装する必要があるとう点を留意する必要があります。



















-300x104.png)





