犬ターネット

twitterの片思いとかとるやつ作ったときの工夫みたいなもん

2012-12-14 twitter

twitterの片思いとかとるやつ 作ったときの工夫について。

結果キャッシュ

アクセス都度 Twitter API 叩きに行くのはバカらしいから、ログインと同時に以下の情報だけ API 叩いてセッションにキャッシュしてる。

フォローしてる user_id 一覧
フォローされてる user_id 一覧
ブロックしてる user_id 一覧
view raw 1.txt hosted with ❤ by GitHub

これで、セッション参照して比較するだけで以下情報が取れる。

フォローしてる user_id 一覧
フォローされてる user_id 一覧
ブロックしてる user_id 一覧
相互フォローしてる user_id 一覧
フォロー返してくれない user_id 一覧
フォロー返しわすれてる user_id 一覧
view raw 2.txt hosted with ❤ by GitHub

screen_name 一覧も、初回だけAPIアクセスして、結果キャッシュするようにしてる。

データ圧縮

各 user_id 一覧や screen_name 一覧 ってこういう配列で持たせてるんだけど、

<?php
$list = array(
'388638837',
'396543280',
'341864784',
'80872288',
'507601253',
'525994619',
);
view raw 3.php hosted with ❤ by GitHub

セッションに格納する場合はシリアライズされて以下みたいな文字列になる。

a:6:{i:0;s:9:"388638837";i:1;s:9:"396543280";i:2;s:9:"341864784";i:3;s:8:"80872288";i:4;s:9:"507601253";i:5;s:9:"525994619";}
view raw 4.txt hosted with ❤ by GitHub

これ、user_id が1000個とかになると結構容量食うから、配列→文字列に変換してる(user_id も screen_name も仕様上は「,」が含まれないから大丈夫)

<?php
$list = implode(',', array(
'388638837',
'396543280',
'341864784',
'80872288',
'507601253',
'525994619',
));
view raw 5.php hosted with ❤ by GitHub

シリアライズするとサイズが約半分に。

s:58:"388638837,396543280,341864784,80872288,507601253,525994619";
view raw 6.txt hosted with ❤ by GitHub

仕上げは gzdeflate 使って圧縮。以下サンプル。

<?php
$list = array(
'388638837',
'396543280',
'341864784',
'80872288',
'507601253',
'525994619',
);
var_dump(
strlen( serialize( $list ) ),
strlen( serialize( implode(',', $list ))),
strlen( serialize( gzdeflate( implode(',', $list ),9)))
);
// int(125)
// int(66)
// int(52)
view raw 7.php hosted with ❤ by GitHub

なんでこんなことしてるかっつうと、appfogの無料プランってストレージやメモリに余裕がないから、削れるところは削ろうっていう考えから。

つっても、ディフォルトのセッションハンドラだと gzdeflate はできないから、独自にセッションハンドラ作んないとだめ。前のエントリ参照。


≪ 2012-12-17
絵本読んでた

2012-12-14 ≫
appfog + PHP 環境でセッションを使うには