諸事情によりもうちょいNucleus利用することにしました。
てことで、Permalink問題。
サイト側が吐くPermalinkは、アクセスの98%は想定したものになっているのでよし。
問題はサーチエンジン、その他からのアクセスがあった場合。
itemidのみでアクセスがあったらcatidを付加してリダイレクトというプラグインをさらっと。
function event_PreItem(&$data)
{
$blogurl = $data['blog']->settings['burl'];
$itemid = $data['item']->itemid;
$catid = $data['item']->catid;
$anchor = strstr($_SERVER['QUERY_STRING'], '#');
if (intGetVar('itemid') && !intGetVar('catid')) {
redirect("{$blogurl}?itemid={$itemid}&catid={$catid}{$anchor}");
}
}
アーカイブの個別アイテム利用してない、カテゴリが常にひとつ存在する、FuncyURL利用してない場合と制限が多いので汎用性のあるプラグインにするの面倒なので自分専用。
どこかにいい方法みつけて実装してそうだし。
この程度だと探す手間>自作だったので。
Nucleusのプラグインの仕様、思ったよりしっかりしてることにびっくり。
なんで、global使いまくりのプラグインが乱立したんだろ。
時代のせいかな。
ついでにverを3.3にアップしました。
アップデート簡単すぎ。
直接コアファイルをいじった記憶はありませんが、なんか不具合を発見しましたらこっそり教えてください。
MySQLは5.0から。
それより前では利用されるインデックスはひとつのみ。
複合インデックスを利用しましょう。
適当にぺちぺち無駄なインデックス張るなと。
regist_dateとかいうtimestamp型にインデックス張ったらほぼ全レコード数のインデックスが。
そもそもregistなんて単語ないんですよ、registerならありますけど。
EXPLAINで常にクエリのコストをチェックしてくださいマジで。
うぉー。
簡単な使い方
// このキャッシュKeyを設定する
$cache_key = '123';
// Cachemanager オブジェクトを生成する
$plugin =& $this->backend->getPlugin();
$cache_manager =& $plugin->getPlugin('Cachemanager', 'Localfile');
// このKeyに対する有効なキャッシュがあるかどうかテストする
if ($cache_manager->isCached($cache_key) { // キャッシュがヒットした !
$data = $cache_manager->get($cache_key);
} else { // 有効なキャッシュが見つからなかった
$data = 'hoge';
// データをキャッシュする
$cache_manager->set($cache_key);
}
実際使うとなるとこんな感じです。
// キャッシュマネージャオブジェクトを生成する
$plugin =& $this->backend->getPlugin();
$cache_manager =& $plugin->getPlugin('Cachemanager', 'Localfile');
// Services_Amazonオブジェクトを生成する
$ecs4 =& new Services_AmazonECS4('access_key_id', 'associate_id');
$search_index = 'Books';
$options = array(
'ResponseGroup' = 'Large',
'Keywords' = 'Ethna',
);
// 一意となるキャッシュキー(文字列)を生成する
$cache_key = md5('ItemSearch' . $search_index . serialize($options));
$cache_lifetime = 3600;
$cache_namespace = 'Services_Amazon';
// 有効なキャッシュが存在するか確認する
if ($cache_manager->isCached($cache_key, $cache_lifetime, $cache_namespace)) {
// キャッシュを取得する
$result = $cache_manager->get($cache_key, $cache_lifetime, $cache_namespace);
if (!Ethna::isError($result)) {
// キャッシュデータをセットしViewへ遷移
$this->af->setAppNe('amazon_items', $result);
return 'amazon_search';
}
}
// データの取得
// 実際はここでServices_Amazonオブジェクトを生成すべき
$result =& $ecs4->ItemSearch($search_index, $options);
// キャッシュへ保存
$cache_manager->set($cache_key, $result, $cache_lifetime, $cache_namespace);
// 取得データをセットしViewへ遷移
$this->af->setAppNe('amazon_items', $result);
return 'amazon_search';
いや、ほんとは適当に書いたのでsyntaxエラーすらチェックしてません。
上記の例ではCachemanager_Localfileを利用していますが、Cachemanager_Memcachedでもそのまま利用できます。
namespace丸ごとキャッシュ削除や、JoJoに古いor利用されていないキャッシュが削除されていく機能は実装されていませんので、誰かがんばれ。
クラスリファレンスはあるから、wikiに必要なのはこの程度の利用法だけでいいのかな。
誰か修正してくれるだろうし、もうちょいまともにしてから投げます。