読者です 読者をやめる 読者になる 読者になる

ログマニアックス

日々学んだこと、気づいたことをメモ代わりに残していければ。カバー範囲は割と広めです。

SiteCatalystで使うクッキーを節約

1165225_26608751

SiteCatalystではクッキーを使って値を保持する実装が多いです。
例えば、Channel Managerプラグインはブックマーク流入を分析するために、
クッキーをひとつ利用することがあります。

こういった、クッキ-を利用する実装の場合、ページのクッキー保持数に気を使う必要があります。

 

クッキーには上限がある

アクセス解析に限らず、様々な場合で、クッキーは使われます。
ユーザーIDや設定内容の保持にも使われますし、
アフィリエイトやリターゲティングにも必須です。
サードパーティクッキーもありますが。。。)

で、1ドメインあたりのクッキー数は実はブラウザごとに上限があって、
上限を超えると古いものは削除されてしまいます。

RFCによると20個までとされて、

[Studying HTTP] HTTP Cookies

サーバからクライアントへクッキーが送られる場合に、expires属性による有効期限内のクッキーは保存されます。 しかし、クライアントが保存することができるクッキーの数には以下のような制限があります。

クッキーの数は、最大で300個まで
1つのクッキーは、NAMEとVALUEを合わせて、最大で4キロバイトまで
1つのサーバ、あるいはドメインにつき、クッキーの数は最大で20個まで
もし1.や3.の制限を越えた場合、クライアントは保存されているクッキーを調べ、最も過去に使用されたクッキーから順に削除するかもしれません。 また、2.の制限を越えるようなクッキーを受け取った場合、クライアントは4キロバイト以内に収まる様にクッキーを削るかもしれません。 そのため、サーバはそのような制限を超えるクッキーを発行すべきではありません。

という制限があります。

とはいえ、ブラウザによっては多少の仕様の違いはあるようで、
例えば、IEでは、

Internet Explorer で、ドメインあたりの Cookie の数の制限が 20 から 50 に増加する

とのことで、50個まで保持できるそうです。

 

プラグインで節約できそう

※これ、まだオイラのサイトでは試していません。

Cookie Combining Pluginという実装を使うと、クッキーを複数個をまとめられるようです。

/*

* Function - read combined cookies

*/

s.c_rr=s.c_r;

s.c_r=new Function("k",""

+"var s=this,d=new Date,v=s.c_rr(k),c=s.c_rr('s_pers'),i,m,e;if(v)ret"

+"urn v;k=s.ape(k);i=c.indexOf(' '+k+'=');c=i<0?s.c_rr('s_sess'):c;i="

+"c.indexOf(' '+k+'=');m=i<0?i:c.indexOf('|',i);e=i<0?i:c.indexOf(';'"

+",i);m=m>0?m:e;v=i<0?'':s.epa(c.substring(i+2+k.length,m<0?c.length:"

+"m));if(m>0&&m!=e)if(parseInt(c.substring(m+1,e<0?c.length:e))<d.get"

+"Time()){d.setTime(d.getTime()-60000);s.c_w(s.epa(k),'',d);v='';}ret"

+"urn v;");

/*

* Function - write combined cookies

*/

s.c_wr=s.c_w;

s.c_w=new Function("k","v","e",""

+"var s=this,d=new Date,ht=0,pn='s_pers',sn='s_sess',pc=0,sc=0,pv,sv,"

+"c,i,t;d.setTime(d.getTime()-60000);if(s.c_rr(k)) s.c_wr(k,'',d);k=s"

+".ape(k);pv=s.c_rr(pn);i=pv.indexOf(' '+k+'=');if(i>-1){pv=pv.substr"

+"ing(0,i)+pv.substring(pv.indexOf(';',i)+1);pc=1;}sv=s.c_rr(sn);i=sv"

+".indexOf(' '+k+'=');if(i>-1){sv=sv.substring(0,i)+sv.substring(sv.i"

+"ndexOf(';',i)+1);sc=1;}d=new Date;if(e){if(e.getTime()>d.getTime())"

+"{pv+=' '+k+'='+s.ape(v)+'|'+e.getTime()+';';pc=1;}}else{sv+=' '+k+'"

+"='+s.ape(v)+';';sc=1;}if(sc) s.c_wr(sn,sv,0);if(pc){t=pv;while(t&&t"

+".indexOf(';')!=-1){var t1=parseInt(t.substring(t.indexOf('|')+1,t.i"

+"ndexOf(';')));t=t.substring(t.indexOf(';')+1);ht=ht<t1?t1:ht;}d.set"

+"Time(ht);s.c_wr(pn,pv,d);}return v==s.c_r(s.epa(k));");

 

こちらのコードをs_codeのプラグインセクションに追記してください。


s.c_r、s.c_wというデフォルトの関数を置換する形で実装しています。

 

数ある自然は大切に

上述のように、SCで使うCookieの節約自体はできそうですが、


そもそものCookieの上限自体は解決できないのが実態です。

Cookieの利用自体は簡単に実装できることもあり、


自分のサイトがいくつ利用しているかはわからないこともあるかもしれません。

Cookieの数が足りてないときには安易に


上述のプラグインに頼らず、実際に利用している、必要なCookieがちゃんと管理されているか、


まずは、確認をしてみましょう

 

元ネタはこちら

Reduce the Number of Cookies SiteCatalyst sets with Cookie Combining Plugin | Web Analytics Land