github::gistを使えば、簡単にブログにソースコードを貼れるんじゃね?
ということで小ネタでやってみる。

仕事でRSSフィードの各種をパースしなくちゃいけなくなったんだけど、複数の仕様に対応するの面倒だから便利なライブラリ無いかなと思って探してみた。
けど、意外に良いのがない。
以前使っていたSimplePieはPHP5で使うとStrict Standardsエラーがガンガン出るので、これはちょっと使いたくないなと。
他のライブラリもメンテナンスが全然されてない様なものだったりすることが多くて、やりたい事は単にブログタイトルと記事一覧を出したいだけなんで、自分でパースしようかなと思って探していたら、いくつかサンプルコードが・・・。

んで、いろいろネット上に転がっていたソースをちょいとまとめてみた。


綺麗に貼れている模様。
便利だねえ、こりゃ。
「少しでも毎月のお小遣いを浮かせたい!!」
「このブログ(CakePHP製)を無料で運営していきたい!!」
ということで、無料で楽しめる(試せる)PHPが利用可能なPaaSを探していて見つけたのがこれ「Pagoda Box」。

■Pagoda Box


今のところプライベートベータ版ということなので、無料で使えるのかもしれないけども、PHP Fogの様に「半年間しか使えない」と決められているようには良いかなって感じ。
行きなり、有料プランのみの提供になる可能性もあるにはあるので、その点はリスキーですが。

基本的な流れはこちらを参考にすればよろし。
[PHP][PaaS]Pagoda Boxを使ってみた | Ryuzee.com


■tmpディレクトリのところでエラー
CakePHPを設定した人には必ず体験していると思うんだけど、CakePHPの場合tmpディレクトリに書き込み権限を与えてあげないといけないんだけど、そこでエラーが出る。
一応、書き込み可能なディレクトリの指定方法はあるみたいなんだけど、キャッシュデータを作成するときにエラーになっている模様。
一応Pagoda Box的には、CacheエンジンでAPC推奨ってことなんで、FileからAPCへ変更すれば、エラーが出なくなりました。

一応ここにCakePHP設置用の公式ガイドがあるので、ここを参考にすればOK。
Pagoda Box - Guides


■独自ドメインの運用も無料
これも「今のところは」なのかもしれないけども、こちらとしては無料で使えるのが必須な項目だったりする。
結構長く続けているブログだしねえ。

んで、基本的には
*.pagodabox.com

みたいなサブドメインになってしまうんだけど、使いたいドメインを指定してしまえばそれでアクセスできるようになります。

ちなみに、*.pagodabox.comというドメインでアクセスに来た場合、強制的に独自のドメインへリダイレクトする方法は、.boxファイルに以下のように書きこめばOK。

■(例)hogehoge.pagodabox.comをhogehoge.comにリダイレクトさせたい場合
url_rewrites:
-
rule: "^(.*)$ http://hogehoge.com$1 permanent"
conditions: - "$host = hogehoge.pagodabox.com"


yaml慣れてないので、非常に手間取った。


■デプロイがまだまだ不安定
この.boxファイルというので、いろんな設定ができるんだけど、この記述方法を間違えるとデプロイ処理中に止まったりする。
これはプライベートベータ版だからなのかわからないけども、とにかく不安定。
理想的には、エラーかなんかだしてロールバックしてくれればいいんだけど、今はフリーズしてにっちもさっちもいかなくなる。
そんな時は、チケットを切って「止まったぞ、なんとかして」みたいに言えば、何とかしてくれます。
僕も、リダイレクトの書き方がよくわからなくて、何度もデプロイが止まってしまい、その都度復旧してもらいました。
まあ、そういうやりとりがプライベートベータの意義かもしれないので、積極的に助けてもらいましょう。


■安定感
実際にここ23日、このブログはPagoda Boxを利用して運用しているんだけど、意外とスピードも出ているし安定していると思う。
たまに時間帯によっては不安定になる場合もあるらしく、1日に数件タイムアウトでエラーになってたりしている。

ちなみに昨日は
全2155リクエストがあって、平均応答時間が0.027。
タイムアウトになったのは0と優秀だった。
日に日に安定しているのかな?

無料プランの1クローンで、1時間に136リクエストあった時間帯は全て遅延なしで応答が出来ていたが、212リクエストあった時間帯は13.68%が1秒未満の遅延が少し出たってなってた。
趣味のブログには十分じゃないかな?
もっとアクセスが増えれば、お金を払ってクローンを増やしていく感じになると思うけど、当分良さそうだ。


■全体のまとめ
個人的には好印象。
商用利用となるとちょっとあれかもしれないが、個人利用には申し分ないと思う。
GitHubにソースを全て挙げなくちゃいけないというのは、セキュリティ的にどうかとは思うが、気になる場合はGithubでプライベートリポジトリを作成すればいい(有料だけど)。
その反面、難しいことは考えずGitHubだけで全てが完了しているとも考えられるので、その辺はトレードオフなのかもしれない。
実際、他のPaaSサービスだとCUIでコマンドをインストールしてごにょごにょしなくちゃいけなかったりするんだけど、Pagoda Boxはコマンド使わなくてもひと通り出来る。(コマンドも用意されているが)
データベースも一時的にphpMyAdmin入れればすぐに動いたし。

CakePHPのキャッシュ周りの作りがアレなせいで、使えるPaaSが限られてしまうんだけども、Pagoda Boxはなかなか面白い選択肢だと思う。
まあ、他のが出たらまた試すけども。
問題はプライベートベータということなので、この先どうなるのかが不透明なところかな?
2010年4月23日現在、Googleからはこんなコードを紹介される。
// Copyright 2009 Google Inc. All Rights Reserved.
$GA_ACCOUNT = "XX-0000000-0";
$GA_PIXEL = "/ga.php";

function googleAnalyticsGetImageUrl() {
global $GA_ACCOUNT, $GA_PIXEL;
$url = "";
$url .= $GA_PIXEL . "?";
$url .= "utmac=" . $GA_ACCOUNT;
$url .= "&utmn=" . rand(0, 0x7fffffff);
$referer = $_SERVER["HTTP_REFERER"];
$query = $_SERVER["QUERY_STRING"];
$path = $_SERVER["REQUEST_URI"];
if (empty($referer)) {
$referer = "-";
}
$url .= "&utmr=" . urlencode($referer);
if (!empty($path)) {
$url .= "&utmp=" . urlencode($path);
}
$url .= "&guid=ON";
return str_replace("&", "&", $url);
} ?>

んで、$_SERVER["HTTP_REFERER"]が無かったりすると、
Notice: Undefined index: HTTP_REFERER...

という感じになる。
まあ、そうだよね。

なので、こんな感じにしておいてあげる。
// Copyright 2009 Google Inc. All Rights Reserved.
$GA_ACCOUNT = "XX-0000000-0";
$GA_PIXEL = "/ga.php";

function googleAnalyticsGetImageUrl() {
global $GA_ACCOUNT, $GA_PIXEL;
$url = "";
$url .= $GA_PIXEL . "?";
$url .= "utmac=" . $GA_ACCOUNT;
$url .= "&utmn=" . rand(0, 0x7fffffff);
- $referer = $_SERVER["HTTP_REFERER"];
- $query = $_SERVER["QUERY_STRING"];
- $path = $_SERVER["REQUEST_URI"];
+ $referer = isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : '';
+ $query = isset($_SERVER["QUERY_STRING"]) ? $_SERVER["QUERY_STRING"] : '';
+ $path = isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : '';
if (empty($referer)) {
$referer = "-";
}
$url .= "&utmr=" . urlencode($referer);
if (!empty($path)) {
$url .= "&utmp=" . urlencode($path);
}
$url .= "&guid=ON";
return str_replace("&", "&", $url);
} ?>

コード見た感じでも2009年からメンテナンスされてないみたいだし、大丈夫なんだろうか。
これも日本独自の携帯事情からなのかしら。
謎。
昨日からずーっと追いかけていてようやくわかりました。

■参考になったサイト
CakePHPを本気で勉強: SimplePieのバグ?

■原因
urlエンコードが正しく行われていないのか、RSSフィードのURLがおかしく変換されてしまってるのが原因。
「?」付きのURLだととりあえずアウト。
Wordpressは「?」とかついちゃうので、もちろんアウト。
Movable Typeなら良いんだろうな。

■対策
・フィードのURLをurlエンコードに影響を受けないものにする
・SimplePieのバージョンを下げる→1.1.3だと動いた
・SimplePieのソースに手を加える

■結論
simplexml関数で自分で書く!

以上!
ローカルの開発環境サーバはタイムアウトなんてしなくても良いのです。
ということで、参考サイトを元に設定。

参考サイト
phpMyAdminのタイムアウト時間変更|HyDEV ~ハイデブ~

#config.ini.php

ini_set("session.gc_maxlifetime", 86400); $cfg['LoginCookieValidity'] = 86400;


とりあえず丸1日にしておいた。
参考サイトのおかげで直ぐに対応出来ました。