Zend FrameworkでどのようにSmartyを組み込むか

2008/05/12 | Zend Framework

先日作ったZend Frameworkウェブアプリだが、実は気になっている部分が一つ。Smartyの使い方というか配置だ。Zend Frameworkのマニュアルには、Smartyを組み込むためのViewスクリプトだけが紹介してある(参照)。しかし、これは単なるスクリプトであって、実際の組み込み方はどこにも書いてない。厳密に言うと、組み込むのはrequireしてオブジェクト生成だが、フレームワーク内での教科書的な組み込み方に関する記述がないのだ。

とりあえず、自分ではZend_Controller_Actionを継承したbaseControllerを作成し、その中でpreDispatchメソッドを定義して、以下のように書いておいた。テンプレートの配置場所とかキャッシュ生成場所とかもルールにのっとって配置するようにした(その他設定はお好み次第で)。

public function preDispatch()
{
  $controllerName  = ucfirst($this->getRequest()->getControllerName());
  $viewDir    = dirname(__FILE__).’/../views';
  $templates_dir  = $viewDir.’/scripts/’.$controllerName;
  $extraParams  = array();
  $extraParams[‘compile_dir’]    = $templates_dir.’/templates_c';
  $extraParams[‘plugins_dir’]    = array(‘plugins’,$viewDir.’/plugins’);
  $extraParams[‘left_delimiter’]  = ‘<{';
  $extraParams[‘right_delimiter’]  = ‘}>';
  
  $this->view    = new Private_View_Smarty($templates_dir<$extraParams);
  $this->view->getEngine()->load_filter(‘pre'<‘convert_encoding’);
}

ただコレだけだと実はNG。例えばVIEWの必要がないアクションを用意した場合、これを組み込んだ基底クラスを継承すると問題が起きる。このメソッドの定義上、該当するテンプレートディレクトリやキャッシュディレクトリが存在しないとおかしなことになるわけだ。

そう考えると、いろいろなエラー制御も含めて、コード自体も設置方法自体も検討しなくてはいけない。悩ましい。

どうせなら、本当に教科書的なものを用意してくれればよかったのにね。

XREAでボトルネックになっている箇所を探したら

2008/05/11 | ケータイ

XREAで携帯向けコンテンツの提供を始めようとしているのだが、なぜか表示が遅い。すごく悩んでいたのだが、ようやく原因がわかった。原因は「携帯向けGoogle Adsense(PHP版)を貼り付けていること」だった。

最初は何が悪いのか全くわからなかった。とにかくリクエストから表示まで10秒くらいかかってしまう。どこがボトルネックになっているのか調べようとして、実際にやってみた作業はコレ。

スクリプトにやたらめったらprint(microtime(true));を記述

この記述がある回数だけ時刻が表示されるわけだが、その差が大きい部分を追うことで、実際にボトルネックになっている箇所を見つけるわけだ。で、追っかけてみた結果、Smartyテンプレート内で「include」している箇所で時間がかかっていることがわかった。「え〜なぜ?」と思いつつ、更に調べてみてincludeされているファイル内に記述されているGoogle Adsense携帯版の記述がボトルネックになっていることがわかった。

そこで「そういえばGoogle Adsense携帯版の実際に記述するコードが、最近やたら長くなったよな」と思い出したので、昔使っていたコードを入れてみた。そしたらなんと動作しない!。Google Adsense携帯版は以前は単にGoogleに配置されているファイルをrequireしているだけだったのだが、そもそもその記述自体がXREAでは許可されていないのだ。つまり「そういうこともあるからGoogle Adsense携帯版のスクリプトが長くなった」らしい。

ということで、副産物的にGoogle Adsense携帯版のことがわかったのだが、結局Google Adsense携帯版は、XREA環境ではどうやっても遅いのだ。仕方なく広告を削除した。

さて、改善されないのか・・・XREAにリクエストを出さねば・・・。

ZendFrameworkでサイトを作ってみた

2008/05/08 | Zend Framework

本を読んだり、資料をあさったりしていても、先へ進めないような気がしたので・・・。ZendFrameworkを使って、実際にサイトを構築してみた(「構築」というほどの大げさなものではないのだが)。コーディングに時間をとられたくなかったので携帯サイトにしてみた。

うちねこ

使用したのは以下の通り。
・Zend_Controller_Action
・Zend_View
・Zend_Db

本当はZend_FormやZend_Mailも使う予定だったのだが、期待通りの動作をしなかったり、早く公開したかったり、とか諸所の理由で最低限のライブラリ群を使用して構築・公開してみた(PEARや一般公開されているライブラリを使用した)。

なお携帯絵文字変換には以下のライブラリを使用した。
MobilePictogramConverter

実際に構築してみると「こんなことができる」「これはできなさそう」「これはバグ?」とか見えてきた。あとは自分なりに使いやすい構成をとれるよう、使い込んでいくだけだ。

Net_POP3でメールの削除ができない

2008/05/06 | その他PEAR全般

Zend_Mailでのメール受信がうまくいかない(場合がある)。一つのライブラリ群に固執するつもりもないのでPEARを使うことにした。PEARでメールを受信するといえば「Net_POP3」が代表的(かな)。受信はこんな感じ。

$pop =& new Net_POP3;
$pop->connect($host);
$result = $pop->login($userId, $password);
if (PEAR::isError($result)) {
  exit(‘Error’);
}else{
  foreach($i=0;$i&lt$pop->numMsg();$i++;){
    $message=$pop->getMsg($i+1);
    //$messageはヘッダ・本文含めて全部
    //処理内容
  }
}

で、メールの削除は処理内容のところで以下のようにすればいいはずなのだが。
$pop->deleteMsg($i+1);

消えない。なぜ?。
答えは簡単。接続終了を明示的に実行していなかったからだ。接続の最後に以下の1行を追加して無事削除することができた。

$pop->disconnect();

トランザクションのcommitみたいなものかな。

Zend_Mimeのバグ?

2008/05/04 | Zend Framework

現在Zend_Mail_Storage_Pop3を使ってメールの受信処理を書いている。しかし使っていくにしたがって、バグっぽい動きをすることがわかった。
添付ファイルつきのメールを受信する際の動作で例外が発生する。具体的にはmultipart/mixedなメールを読み取る際に、boundaryが読み取れる場合と読み取れない場合があるようだ。
boundaryを求める処理は、Zend_Mime_Decodeに処理が委譲され、その中でiconv_mime_decode_headersという関数で処理されているのだが・・・。
問題は「できる」場合と「できない」場合があるということなのだが、まだ原因がつかめない。
まだまだZendFrameworkにはバグが出てきそうだ。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net