電脳ではたらくOpenPNE開発者の日記@ネット このページをアンテナに追加 RSSフィード

2011-08-27

Bloggerに移行してみる!の巻!

はい!ギュンばんわ!

はてなダイアリー」重いなぁ。。。エントリー書く時、若干ストレスを感じる。。。

あとフォトライフの挙動も若干不満あり。。。

ということで、より安定して、より速いブログ環境を求めて、Bloggerに移行してみるよと。

電脳ではたらくOpenPNE開発者の日記@ネット

2011-08-25

段階的に負荷をあげて、OpenPNE3.6beta13とOpenPNE2.14.9の負荷性能を比較してみた!の巻!

f:id:openpne:20110825164856p:image:w360

昨日に引き続き負荷性能の比較ですよと。

段階的に負荷を増やしての限界テストをやってみましたよと。

平均レスポンスタイムが5秒以内なところでいうと、

  • OpenPNE3.6beta13(Doctrine版・コアだけ・マイホームにアクセス)
    • PVは、約700PV/分(約11PV/秒)
    • httpdの平均メモリ使用量は、約35MB
    • 平均レスポンスタイムは、約5秒
  • OpenPNE2.14.9(マイホームにアクセス)
    • PVは、約1500PV/分(約25PV/秒)
    • httpdの平均メモリ使用量は、約13MB
    • 平均レスポンスタイムは、約2.5秒

な感じですかねー

段階的な負荷の上げ方は、15秒に1接続ずつ増やしていく感じでやりました。

なんかOpenPNE2.14.9が尻すぼみなのが気になる(ネットワークの調子がおかしくなった可能性あり)なので、再試験してみるかなぁ〜www

負荷をかけるのに使ったのは、今回あらたに作った↓であります。

https://github.com/rysk92/webapp_monitor/blob/master/reqsan_manager.py

2011-08-24

OpenPNE3.6beta13とOpenPNE2.14.9の負荷性能の比較してみた!の巻!

f:id:openpne:20110824191630p:image

先日の芭蕉1,2,3サーバ達で、OpenPNE3.6系とOpenPNE2.14系でどのくらいの負荷性能の差があるのか気になったのでやってみた。

  • OpenPNE3.6beta13(Doctrine版・コアだけ・マイホームにアクセス)
    • PVは、約290PV/分(約4.8PV/秒)
    • httpdの平均メモリ使用量は、約34MB
    • 平均レスポンスタイムは、約2秒
  • OpenPNE2.14.9(マイホームにアクセス)
    • PVは、約500PV/分(約8.3PV/秒)
    • httpdの平均メモリ使用量は、約13MB
    • 平均レスポンスタイムは、約1秒

OpenPNE2.14.9の方はApacheのMaxClientとかいじれば、もう少し成績上がりそうな気がするな。

ちなみにメンバー検索でやると↓。2.14.9は条件なしの検索でも複雑なクエリ打ってるから、まぁこうなるよね。

  • OpenPNE3.6beta13(Doctrine版・コアだけ・38万人のデータでメンバー検索にアクセス)
    • PVは、約150PV/分。。。
    • httpdの平均メモリ使用量は、約37MB
    • 平均レスポンスタイムは、3〜4秒

で、興味本位で「ただのHello World!だとどのくらいなんだろう?」と思ったので、やってみた。

  • OpenPNE2.14.9(38万人のデータでメンバー検索にアクセス)
    • PVは、約9000PV/分(150PV/秒)
    • httpdの平均メモリ使用量は、約5MB
    • 平均レスポンスタイムは、約0.2ミリ秒

なるほど。

ちなみ使ったスクリプトとかは↓に置いた。

https://github.com/rysk92/doc/tree/master/20110824_webapp_monitor_openpne

2011-08-23

はい!OpenPNE3.6beta13、beta11(Propel改造版)、3.4.15、3.2.7.5の負荷性能を比較してみた!の巻!

f:id:openpne:20110823111931p:image:w360:right

はい!ギュンばんわ!

OpenPNE3の負荷性能の可視化のツールで、

  • OpenPNE3.6beta13(Doctrine版・コアだけ)
  • OpenPNE3.6beta11(Propel改造版・コアだけ)
  • OpenPNE3.4.15(Doctrine版・コアだけ)
  • OpenPNE3.2.7.5(Doctrine版・コアだけ)

に約38万ユーザ(特に38という数字に意味はなくテストしている初期段階で使った数字をそのまま使ってしまった。10万とか50万とか100万とかに今後修正したい)のデータを投入し、ApacheBenchで同時接続10で1時間負荷をかけてみた。

結果は、

  • OpenPNE3.6beta13(Doctrine版・コアだけ)
    • PVは、約150PV/分。。。
    • httpdの平均メモリ使用量は、約37MB。。。
    • 平均レスポンスタイムは、3〜4秒。。。
  • OpenPNE3.6beta11(Propel改造版・コアだけ)
    • PVは、約190PV/分。。。
    • httpdの平均メモリ使用量は、約41MB。。。
    • 平均レスポンスタイムは、3〜4秒。。。
  • OpenPNE3.4.15(Doctrine版・コアだけ)
    • PVは、約90PV/分。。。
    • httpdの平均メモリ使用量は、約25MB。。。
    • 平均レスポンスタイムは、5〜6秒。。。
  • OpenPNE3.2.7.5(Doctrine版・コアだけ)
    • PVは、約90PV/分。。。
    • httpdの平均メモリ使用量は、約33MB。。。
    • 平均レスポンスタイムは、5〜6秒。。。

な感じ。。。

ピアレビューできるように負荷性能検証環境と負荷性能検証方法の手順を追って示すよ!

#2011/8/23 16:45追記

ハードウェアの素性、各OpenPNEのセットアップ方法を追記した!

検証の生データとかは↓ね。

https://github.com/rysk92/doc/tree/master/20110823_webapp_monitor_openpne

#2011/8/23 16:51追記

次は、

  • OpenPNE2.14での検証
  • 段階的に負荷を増やしての限界テスト

かな〜

はい!負荷性能検証で使っているサーバを紹介するよ!の巻!

f:id:openpne:20110823142150j:image:medium

はい!3.6beta13、beta11(Propel改造板)、3.4.15、3.2.7.5の負荷性能を比較してみた!の巻!で使ってるサーバを紹介するよ。

■Webサーバ(芭蕉1と命名)

インテル Boxed Intel Core 2 Quad Q8400S 2.66GHz 4MB 45nm 65W BX80580Q8400S

http://www.amazon.co.jp/gp/product/B0027K74DC/

インテル Boxed Intel Desk Top Board G41MJ BOXDG41MJ

http://www.amazon.co.jp/gp/product/B001W9JMOS

WesternDigital WD3200BEKT ScorpioBlack 2.5inch 7200rpm 320GB 16MB SATA/3.0Gbs

http://www.amazon.co.jp/gp/product/B001E92Y8M

Flex-ATX電源 TOP-220W-FLEX

http://www.amazon.co.jp/gp/product/B0041G2778

ノーブランド DIMM DDR2 SDRAM PC6400 4GB

http://kakaku.com/item/05200013154/

CPU: \17,000

MEM: \7,800

M/B: \7,200

HDD: \6,400

PWR: \7,000

メモリ保証: \1,000

合計: \54,200

UNIX Benchmarks (Version 5.1.2)のスコア

System Benchmarks Index Score, 3874.0

DBサーバ(芭蕉3と命名)

インテル Boxed Intel Core i5 i5-760 2.80GHz 8M LGA1156 Lynnfield BX80605I5760

http://www.amazon.co.jp/dp/B003VANRAQ/

BIOSTAR LGA1156 MicroATXマザーボード TH55B HD

http://www.amazon.co.jp/dp/B003DH9IQ4/

シー・エフ・デー販売 Elixir デスクトップ用メモリ DDR3 W3U1333Q-4G DDR3 PC3-10600 CL9 4GB x 2枚セット

http://www.amazon.co.jp/dp/B00405SB7U/

日立 HGST Deskstar パッケージ版 3.5inch 500GB 16MB 7200rpm 0S02600

http://www.amazon.co.jp/dp/B003Y8YVPK/

アビー ZUMAX 360W ATX電源 ZU-360B0

http://www.amazon.co.jp/dp/B001P4QCIO/

CPU: \19,079

MEM: \10,259

M/B: \8,142

HDD: \3,680

PWR: \2,980

合計: \44,131

UNIX Benchmarks (Version 5.1.2)のスコア

System Benchmarks Index Score, 2601.4


■ApacheBench用サーバ(芭蕉2と命名)

AMD AMD AthlonII X2 240e AD240EHDGQBOX

http://www.amazon.co.jp/dp/B002PA7U88/

MSI M-ATX AMDシリーズ マザーボード 785GM-P45

http://www.amazon.co.jp/dp/B00389P3VG/

シー・エフ・デー販売 Elixir デスクトップ用メモリ DDR3 W3U1333Q-4G DDR3 PC3-10600 CL9 4GB x 2枚セット

http://www.amazon.co.jp/dp/B00405SB7U/

日立 HGST Deskstar パッケージ版 3.5inch 500GB 16MB 7200rpm 0S02600

http://www.amazon.co.jp/dp/B003Y8YVPK

サイズ ATX250W電源 Ichi Power 250 IP250A

http://www.amazon.co.jp/dp/B003H34AMQ/

CPU: \5,429

MEM: \10,259

M/B: \5,717

HDD: \3,680

PWR: \2,059

合計: \27,144

UNIX Benchmarks (Version 5.1.2)のスコア

System Benchmarks Index Score, 1566.5

はい!OpenPNE3.6beta11(Propel改造版・コアだけ)の負荷検証環境構築方法!の巻!

1) まず芭蕉1(Web)、芭蕉3(DB)にOpenPNE3をセットアップ

git clone -b propel git://github.com/upsilon/OpenPNE3.git op36propel.example.com
git submodule init
git submodule update
cd plugins/sfPropel15Plugin/lib
git clone -b 1.6 git://github.com/Xosofox/propelVendor.git vendor
cd ../../../
cp config/ProjectConfiguration.class.php{.sample,}
cp config/OpenPNE.yml{.sample,}
php symfony openpne:permission
cd plugins/
git clone git://github.com/ebihara/opAuthMailAddressPlugin.git
cd ../
php symfony plugin:publish-assets

cat > config/databases.yml <<EOF
all:
  propel:
    class: sfPropelDatabase
    param:
      phptype: mysql
      dsn: 'mysql:dbname=op36propel_example_com;host=[芭蕉3のIP]'
      encoding: utf8
      username: db_user
      password: db_pass
EOF

mysql -h [芭蕉3のIP] -u db_user -p
CREATE DATABASE op36propel_example_com DEFAULT CHARACTER SET utf8;

php symfony propel:build --all --and-load

cd plugins
git clone git://github.com/rysk92/opPvPlugin.git
cd ../
php symfony cc

cat > insert.php <<EOF


require_once 'config/ProjectConfiguration.class.php';
$configuration = ProjectConfiguration::getApplicationConfiguration('pc_frontend', 'prod', false);
sfContext::createInstance($configuration);

$con = Propel::getConnection(MemberPeer::DATABASE_NAME);
$con->beginTransaction();

for ($i = 2; $i <= 380000; $i++)
{
  echo 'member: '.$i."\n";
  $member = new Member();
  $member->setName('dummy'.$i);
  $member->setIsActive(true);
  $member->save();
}

$con->commit();
EOF

time php insert.php
(大体5分ぐらいだった)

2) 芭蕉2から負荷をかける

time ab -n 10000 -c 10 -C OpenPNE_pc_frontend=[cookieの値] http://op36propel.example.com/member/search

(大体50分ぐらいだった)

3) 芭蕉1にてレポートを作成

このへん参考に

はい!OpenPNE3.6beta13(Doctrine版・コアだけ)の負荷検証環境構築方法!の巻!

1) まず芭蕉1、芭蕉3にOpenPNE3をセットアップ

git clone git://github.com/openpne/OpenPNE3.git op36doctrine.example.com
cd op36doctrine.example.com
git checkout OpenPNE-3.6beta13
cp config/ProjectConfiguration.class.php{.sample,}
cp config/OpenPNE.yml{.sample,}
php symfony openpne:permission
cd plugins/
git clone git://github.com/ebihara/opAuthMailAddressPlugin.git
cd ../
php symfony plugin:publish-assets

mysql -h [芭蕉3のIP] -u db_user -p
CREATE DATABASE op36doctrine_example_com DEFAULT CHARACTER SET utf8;

cat > config/databases.yml <<EOF
all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:dbname=op36doctrine_example_com;host=[芭蕉3のIP]'
      encoding: utf8
      username: db_user
      password: db_pass

prod:
  doctrine:
    param:
      profiler: false
EOF

php symfony doctrine:build --all --and-load

cd plugins
git clone git://github.com/kawahara/opKdtPlugin.git
cd ../
cd plugins
git clone git://github.com/rysk92/opPvPlugin.git
cd ../
php symfony cc

php symfony opKdt:generate-member --env=prod --number=380000
(大体75分ぐらいだった)

2) 芭蕉2から負荷をかける

time ab -n 10000 -c 10 -C OpenPNE_pc_frontend=[cookieの値] http://op36doctrine.example.com/member/search

(大体70分ぐらいだった)

3) 芭蕉1にてレポートを作成

このへん参考に

はい!OpenPNE3.4.15(Doctrine版・コアだけ)の負荷検証環境構築方法!の巻!

1) まず芭蕉1、芭蕉3にOpenPNE3をセットアップ

git clone git://github.com/openpne/OpenPNE3.git op34doctrine.example.com
cd op34doctrine.example.com
git checkout OpenPNE-3.4.15
cp config/ProjectConfiguration.class.php{.sample,}
cp config/OpenPNE.yml{.sample,}
php symfony openpne:permission
cd plugins/
git clone git://github.com/ebihara/opAuthMailAddressPlugin.git
cd ../
php symfony plugin:publish-assets

mysql -h [芭蕉3のIP] -u db_user -p
CREATE DATABASE op34doctrine_example_com DEFAULT CHARACTER SET utf8;

cat > config/databases.yml <<EOF
all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:dbname=op34doctrine_example_com;host=[芭蕉3のIP]'
      encoding: utf8
      username: db_user
      password: db_pass

prod:
  doctrine:
    param:
      profiler: false
EOF

php symfony doctrine:build --all --and-load

cd plugins
git clone git://github.com/kawahara/opKdtPlugin.git
cd ../
cd plugins
git clone git://github.com/rysk92/opPvPlugin.git
cd ../
php symfony cc

php symfony opKdt:generate-member --env=prod --number=380000
(大体75分ぐらいだった)

2) 芭蕉2から負荷をかける

time ab -n 10000 -c 10 -C OpenPNE_pc_frontend=[cookieの値] http://op34doctrine.example.com/member/search

(大体103分ぐらいだった)

3) 芭蕉1にてレポートを作成

このへん参考に

はい!OpenPNE3.2.7.5(Doctrine版・コアだけ)の負荷検証環境構築方法!の巻!

1) まず芭蕉1、芭蕉3にOpenPNE3をセットアップ

git clone git://github.com/openpne/OpenPNE3.git op32doctrine.example.com
cd op32doctrine.example.com
git checkout OpenPNE-3.2.7.5

cp config/ProjectConfiguration.class.php{.sample,}
cp config/OpenPNE.yml{.sample,}
php symfony openpne:permission
cd plugins/
git clone git://github.com/ebihara/opAuthMailAddressPlugin.git
cd ../
php symfony plugin:publish-assets

mysql -h [芭蕉3のIP] -u db_user -p
CREATE DATABASE op32doctrine_example_com DEFAULT CHARACTER SET utf8;

cat > config/databases.yml <<EOF
all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:dbname=op32doctrine_example_com;host=[芭蕉3のIP]'
      encoding: utf8
      username: db_user
      password: db_pass

prod:
  doctrine:
    param:
      profiler: false
EOF

php symfony doctrine:build-all-load

cd plugins
git clone git://github.com/kawahara/opKdtPlugin.git
cd ../
cd plugins
git clone git://github.com/rysk92/opPvPlugin.git
cd ../
php symfony cc

php symfony opKdt:generate-member --env=prod --number=380000
(大体70分ぐらいだった)

2) 芭蕉2から負荷をかける

time ab -n 10000 -c 10 -C OpenPNE_pc_frontend=[cookieの値] http://op32doctrine.example.com/member/search

(大体103分ぐらいだった)

3) 芭蕉1にてレポートを作成

このへん参考に

2011-08-22

はい!OpenPNE3の負荷性能を可視化していってみる!の巻!

f:id:openpne:20110822134647p:image:medium:rightf:id:openpne:20110822134646p:image:medium:rightf:id:openpne:20110822134645p:image:medium:right

はい!ギュンばんわ!

OpenpNE3の負荷性能を可視化していってみようかなと。

ということで、

httpdプロセスの挙動とか、sarの値とか、PVとかを可視化するツールを作ってみました。

https://github.com/rysk92/webapp_monitor

これです。

使い方はREADMEの通りで、添付の画像みたいな感じでグラフを吐き出せますと。

このツールを改良しつつ、チューニングのビフォー・アフターをみていこうかなと。

ちなみにグラフはPythonのmatplotlibってので描いてみましたよと。

2011-08-17

はい!なんとなくOpenPNE3.6 beta12のソースを俯瞰してみる!の巻!

f:id:openpne:20110818014543p:image:right

はい!ギュンばんわ!

プロジェクトの見積りとかのために作ったツールを共有してみたりする。

ソースは、

https://github.com/rysk92/chartsrc

で、

git clone git://github.com/openpne/OpenPNE3.git

cd OpenPNE3

git checkout OpenPNE-3.6beta12

とかやって、

python chartsrc.py ../OpenPNE3

とかやるとtsvで、

ファイルの場合、

  • ファイルサイズ
  • 拡張子
  • 行数
  • 文字数
  • 単語数

が出る。

ディレクトリの場合、

が出る。

吐き出した結果は、

https://github.com/rysk92/doc/tree/master/20110818_chartsrc

に置いたwww

2011-07-21

はい!OpenPNE3のクッキーとセッションについて整理してみる!の巻!

はい!ギュンばんわ!

みなさんOpenPNE3のセッションとクッキーの挙動を把握してますか?

ちょっとスマホセッションとクッキーの設計を考えてるんで、整理してみるよ!

まずはpc_frontendから。

■1■はじめてSNSのトップページを開いた時( http://op36-beta-head.myzw2.pne.jp/ )

  • 生成されたクッキー
名前(name)	OpenPNE_pc_frontend
値(value)	v76k4q1j6oriphkfv2v92crht6
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
cat sess_v76k4q1j6oriphkfv2v92crht6
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";symfony/user/sfUser/lastRequest|i:1311225851;symfony/user/sfUser/authenticated|b:0;symfony/user/sfUser/credentials|a:0:{}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_v76k4q1j6oriphkfv2v92crht6
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";
symfony/user/sfUser/lastRequest|i:1311225851;
symfony/user/sfUser/authenticated|b:0;
symfony/user/sfUser/credentials|a:0:{}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}
symfony/user/sfUser/culture|s:5:"ja_JP";

■2■次回から自動的にログインを「しない」でログインしたあと( http://op36-beta-head.myzw2.pne.jp/ )

  • 生成されたクッキー
名前(name)	OpenPNE_pc_frontend
値(value)	270tr3aiiqflnso8p7ge1pp6d0
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
cat sess_270tr3aiiqflnso8p7ge1pp6d0
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";symfony/user/sfUser/lastRequest|i:1311185502;symfony/user/sfUser/authenticated|b:1;symfony/user/sfUser/credentials|a:1:{i:0;s:9:"SNSMember";}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:2:{s:9:"auth_mode";s:11:"MailAddress";s:9:"member_id";s:1:"1";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_270tr3aiiqflnso8p7ge1pp6d0
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";
symfony/user/sfUser/lastRequest|i:1311185502;
symfony/user/sfUser/authenticated|b:1;
symfony/user/sfUser/credentials|a:1:{i:0;s:9:"SNSMember";}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:2:{s:9:"auth_mode";s:11:"MailAddress";s:9:"member_id";s:1:"1";}}
symfony/user/sfUser/culture|s:5:"ja_JP";

■3■ログアウトしたあと( http://op36-beta-head.myzw2.pne.jp/member/login )

  • 生成されたクッキー
名前(name)	OpenPNE_pc_frontend
値(value)	j0gs7f5cv4b3u1v0rpj7v9sm07
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
cat sess_j0gs7f5cv4b3u1v0rpj7v9sm07
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";symfony/user/sfUser/lastRequest|i:1311185648;symfony/user/sfUser/authenticated|b:0;symfony/user/sfUser/credentials|a:0:{}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_j0gs7f5cv4b3u1v0rpj7v9sm07
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";
symfony/user/sfUser/lastRequest|i:1311185648;
symfony/user/sfUser/authenticated|b:0;
symfony/user/sfUser/credentials|a:0:{}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}
symfony/user/sfUser/culture|s:5:"ja_JP";

■4■次回から自動的にログインを「する」でログインしたあと( http://op36-beta-head.myzw2.pne.jp/ )

  • 生成されたクッキー(その1)
名前(name)	OpenPNE_pc_frontend
値(value)	8e1i4gsofsbevptaf9sdm6aqb0
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
cat sess_8e1i4gsofsbevptaf9sdm6aqb0 
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";symfony/user/sfUser/lastRequest|i:1311185829;symfony/user/sfUser/authenticated|b:1;symfony/user/sfUser/credentials|a:1:{i:0;s:9:"SNSMember";}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:2:{s:9:"auth_mode";s:11:"MailAddress";s:9:"member_id";s:1:"1";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_8e1i4gsofsbevptaf9sdm6aqb0
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";
symfony/user/sfUser/lastRequest|i:1311185829;
symfony/user/sfUser/authenticated|b:1;
symfony/user/sfUser/credentials|a:1:{i:0;s:9:"SNSMember";}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:2:{s:9:"auth_mode";s:11:"MailAddress";s:9:"member_id";s:1:"1";}}
symfony/user/sfUser/culture|s:5:"ja_JP";
  • 生成されたクッキー(その2)
名前(name)	e6d7f8f66ff1bebd8be7e7f321e6d14c
値(value)	YToyOntpOjA7czoxOiIxIjtpOjE7czo2NDoiZTRiMGMzMGQwNzYxOWM0ZjgxMDhlNzUwYjhjNmRmMzk3OGQxYTI4YzhlNzc4MWFkNTQ4NzBiMjY0OTU0NjQyNiI7fQ==
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	Fri, 19 Aug 2011 18:21:01 GMT
  • 生成されたクッキー(その2)のnameの値からセッションを取ってくる方法
↓の★あたりでドメインのmd5を算出して、そこから取ってる。
 /**
  * get remember login cookie
  *
  * @return array
  */
  protected function getRememberLoginCookie()
  {
★    $key = md5(sfContext::getInstance()->getRequest()->getHost());
    if ($value = sfContext::getInstance()->getRequest()->getCookie($key))
    {
      $value = unserialize(base64_decode($value));

      return $value;
    }
  }
  • 生成されたクッキー(その2)のnameの値からセッションの値をとって、そこからmember_idをとる方法
↓の★あたりでクッキーの値をbase64_decodeしてunserializeして値を取ってる。
 /**
  * get remember login cookie
  *
  * @return array
  */
  protected function getRememberLoginCookie()
  {
    $key = md5(sfContext::getInstance()->getRequest()->getHost());
    if ($value = sfContext::getInstance()->getRequest()->getCookie($key))
    {
★      $value = unserialize(base64_decode($value));

      return $value;
    }
  }

で、

$value[0] = (string) '1';

$value[1] = (string) 'f9af432578a4aef988d4eb6eb5a81abf08e6b2ac3d18412226633308b6d2df2e';

な感じになって、$value[0]がmember_id、$value[1]がremember_key。

でmember_configに問い合わせて、レコードがあったら、認証すると。

mysql> select * from member_config where name = 'remember_key'\G
*************************** 1. row ***************************
             id: 6
      member_id: 1
           name: remember_key
          value: f9af432578a4aef988d4eb6eb5a81abf08e6b2ac3d18412226633308b6d2df2e
 value_datetime: NULL
name_value_hash: a1eaf9b5b84db3ccbeb4567f4e4d4d0e
     created_at: 2011-07-21 03:17:08
     updated_at: 2011-07-21 03:58:20
1 row in set (0.00 sec)

■5■ログアウトしたあと

  • 生成されたクッキー
名前(name)	OpenPNE_pc_frontend
値(value)	glu8b59sg44qsl7lqiqtkivop3
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
cat sess_glu8b59sg44qsl7lqiqtkivop3
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";symfony/user/sfUser/lastRequest|i:1311185975;symfony/user/sfUser/authenticated|b:0;symfony/user/sfUser/credentials|a:0:{}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_glu8b59sg44qsl7lqiqtkivop3
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";
symfony/user/sfUser/lastRequest|i:1311185975;
symfony/user/sfUser/authenticated|b:0;
symfony/user/sfUser/credentials|a:0:{}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}
symfony/user/sfUser/culture|s:5:"ja_JP";

■6■ソースコードへのポインタ

OpenPNE_pc_frontendのクッキーとセッション辺りが生成される(為の処理がされる)のは、

cache/apache2handler/pc_frontend/prod/config/config_core_compile.yml.php

の↓あたり。

3715   public function initialize($options = null)
3716   {
3717     $cookieDefaults = session_get_cookie_params();
3718     $options = array_merge(array(
3719       'session_name'            => 'symfony',
3720       'session_id'              => null,
3721       'auto_start'              => true,
3722       'session_cookie_lifetime' => $cookieDefaults['lifetime'],
3723       'session_cookie_path'     => $cookieDefaults['path'],
3724       'session_cookie_domain'   => $cookieDefaults['domain'],
3725       'session_cookie_secure'   => $cookieDefaults['secure'],
3726       'session_cookie_httponly' => isset($cookieDefaults['httponly']) ? $cookieDefaults['httponly'] : false,
3727       'session_cache_limiter'   => 'none',
3728     ), $options);
3729         parent::initialize($options);
3730         $sessionName = $this->options['session_name'];
3731     session_name($sessionName);
3732     if (!(boolean) ini_get('session.use_cookies') && $sessionId = $this->options['session_id'])
3733     {
3734       session_id($sessionId);
3735     }
3736     $lifetime = $this->options['session_cookie_lifetime'];
3737     $path     = $this->options['session_cookie_path'];
3738     $domain   = $this->options['session_cookie_domain'];
3739     $secure   = $this->options['session_cookie_secure'];
3740     $httpOnly = $this->options['session_cookie_httponly'];
3741     session_set_cookie_params($lifetime, $path, $domain, $secure, $httpOnly);
3742     if (null !== $this->options['session_cache_limiter'])
3743     {
3744       session_cache_limiter($this->options['session_cache_limiter']);
3745     }
3746     if ($this->options['auto_start'] && !self::$sessionStarted)
3747     {
3748       session_start();
3749       self::$sessionStarted = true;
3750     }
3751   }

はい!現状のスマホ対応版のクッキーとセッションについて整理して、あるべき設計を考えてみる!の巻!

はい!ギュンばんわ!

スマホ版を考えてみるわよ!

■1■はじめてSNSのトップページを開いた時( http://touch.pne.jp/ )

  • 生成されたクッキー
名前(name)	symfony
値(value)	80gqa8d0aag0bkml6h35e20bt2
ホスト(host)	touch.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
cat sess_80gqa8d0aag0bkml6h35e20bt2
OpenPNE/user/opSecurityUser/site_identifier|s:19:"http://touch.pne.jp";symfony/user/sfUser/lastRequest|i:1311228672;symfony/user/sfUser/authenticated|b:0;symfony/user/sfUser/credentials|a:0:{}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_v76k4q1j6oriphkfv2v92crht6
OpenPNE/user/opSecurityUser/site_identifier|s:19:"http://touch.pne.jp";
symfony/user/sfUser/lastRequest|i:1311228672;
symfony/user/sfUser/authenticated|b:0;
symfony/user/sfUser/credentials|a:0:{}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}
symfony/user/sfUser/culture|s:5:"ja_JP";

■2■次回から自動的にログインを「しない」でログインしたあと( http://touch.pne.jp/ )

(ていうか現在は「次回から自動的にログイン機能」がまだないです)

  • 生成されたクッキー
名前(name)	symfony
値(value)	0lmeniod9v5ner58vbcu7lv587
ホスト(host)	touch.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
cat sess_80gqa8d0aag0bkml6h35e20bt2 
OpenPNE/user/opSecurityUser/site_identifier|s:19:"http://touch.pne.jp";symfony/user/sfUser/lastRequest|i:1311228672;symfony/user/sfUser/authenticated|b:0;symfony/user/sfUser/credentials|a:0:{}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_80gqa8d0aag0bkml6h35e20bt2 
OpenPNE/user/opSecurityUser/site_identifier|s:19:"http://touch.pne.jp";
symfony/user/sfUser/lastRequest|i:1311228672;
symfony/user/sfUser/authenticated|b:0;
symfony/user/sfUser/credentials|a:0:{}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}
symfony/user/sfUser/culture|s:5:"ja_JP";

■3■ログアウトしたあと( http://touch.pne.jp/logout )

  • 生成されたクッキー
名前(name)	symfony
値(value)	5j8ug2dsrsh28vqjbciqbo4691
ホスト(host)	touch.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
cat sess_5j8ug2dsrsh28vqjbciqbo4691 
OpenPNE/user/opSecurityUser/site_identifier|s:19:"http://touch.pne.jp";symfony/user/sfUser/lastRequest|i:1311229083;symfony/user/sfUser/authenticated|b:0;symfony/user/sfUser/credentials|a:0:{}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}symfony/user/sfUser/culture|s:5:"ja_JP";
(読みやすいように展開)
cat sess_5j8ug2dsrsh28vqjbciqbo4691 
OpenPNE/user/opSecurityUser/site_identifier|s:19:"http://touch.pne.jp";
symfony/user/sfUser/lastRequest|i:1311229083;
symfony/user/sfUser/authenticated|b:0;
symfony/user/sfUser/credentials|a:0:{}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}
symfony/user/sfUser/culture|s:5:"ja_JP";

はい!OpenPNE3のクッキーとセッションについてガラケー(mobile_frontend)もついでに整理してみる!の巻!

はい!ギュンばんわ!

ガラケー(mobile_frontend)もついでに整理してみる!

■1■はじめてSNSのトップページを開いた時( http://op36-beta-head.myzw2.pne.jp/ )

  • 生成されたクッキー
名前(name)	OpenPNE_mobile_frontend
値(value)	6b3nbjqjnk5ghrvqg4i4q5f9o5
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
cat sess_6b3nbjqjnk5ghrvqg4i4q5f9o5 
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";symfony/user/sfUser/lastRequest|i:1311232107;symfony/user/sfUser/authenticated|b:0;symfony/user/sfUser/credentials|a:0:{}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_6b3nbjqjnk5ghrvqg4i4q5f9o5 
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";
symfony/user/sfUser/lastRequest|i:1311232107;
symfony/user/sfUser/authenticated|b:0;
symfony/user/sfUser/credentials|a:0:{}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}
symfony/user/sfUser/culture|s:5:"ja_JP";

■2■ガラケーメールアドレスパスワードログインしたあと( http://op36-beta-head.myzw2.pne.jp/ )

  • 生成されたクッキー
名前(name)	OpenPNE_mobile_frontend
値(value)	jn0cehd934js22je986p871co2
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
cat sess_jn0cehd934js22je986p871co2
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";symfony/user/sfUser/lastRequest|i:1311232281;symfony/user/sfUser/authenticated|b:1;symfony/user/sfUser/credentials|a:1:{i:0;s:9:"SNSMember";}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:2:{s:9:"auth_mode";s:11:"MailAddress";s:9:"member_id";s:1:"1";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_jn0cehd934js22je986p871co2
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";
symfony/user/sfUser/lastRequest|i:1311232281;
symfony/user/sfUser/authenticated|b:1;
symfony/user/sfUser/credentials|a:1:{i:0;s:9:"SNSMember";}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:2:{s:9:"auth_mode";s:11:"MailAddress";s:9:"member_id";s:1:"1";}}
symfony/user/sfUser/culture|s:5:"ja_JP";

■4■ガラケーで「かんたんログイン」でログインしたあと( http://op36-beta-head.myzw2.pne.jp/ )

  • 生成されたクッキー(その1)
名前(name)	OpenPNE_mobile_frontend
値(value)	08d3ipqnt1kjogji4mbg5g87g6
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
cat sess_08d3ipqnt1kjogji4mbg5g87g6
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";symfony/user/sfUser/lastRequest|i:1311673254;symfony/user/sfUser/authenticated|b:1;symfony/user/sfUser/credentials|a:1:{i:0;s:9:"SNSMember";}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:2:{s:9:"auth_mode";s:9:"MobileUID";s:9:"member_id";s:1:"1";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_08d3ipqnt1kjogji4mbg5g87g6
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";
symfony/user/sfUser/lastRequest|i:1311673254;
symfony/user/sfUser/authenticated|b:1;
symfony/user/sfUser/credentials|a:1:{i:0;s:9:"SNSMember";}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:2:{s:9:"auth_mode";s:9:"MobileUID";s:9:"member_id";s:1:"1";}}
symfony/user/sfUser/culture|s:5:"ja_JP";
  • 生成されたクッキー(その2)
名前(name)	op_mobile_uid
値(value)	b16487624c9080d54a41c0c9afc2e15a579d9025aa3350c91f766321621f0965
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	Sat, 26 Jul 2031 09:21:18 GMT

2011-07-13

はい!OpenPNE3をXdebugでステップ実行とかする方法!の巻!

f:id:openpne:20110713190123p:image:w360:right

はい!ギュンばんわ!

みなさんデバッガ使ってますか?

OpenPNE3ってOpenPNE2よりソースが複雑になってて、デバッガとか使ってソースの挙動追いたくないすか?

ということでOpenPNE3をXdebugでステップ実行する方法を書きますよと。

Xdebugインストール

pecl install xdebug-beta

PHPの設定

/etc/php.d/xdebug.ini

を、

zend_extension=/usr/lib64/php/modules/xdebug.so

[debug]

xdebug.remote_autostart=off

xdebug.remote_enable=on

xdebug.remote_handler=dbgp

xdebug.remote_mode=req

xdebug.remote_host=127.0.0.1

xdebug.remote_port=9000

; General

xdebug.auto_trace=off

xdebug.collect_includes=on

xdebug.collect_params=off

xdebug.collect_return=off

xdebug.default_enable=on

xdebug.extended_info=1

xdebug.manual_url=http://www.php.net

xdebug.show_local_vars=0

xdebug.show_mem_delta=0

xdebug.max_nesting_level=100

;xdebug.idekey=

; Trace options

xdebug.trace_format=0

xdebug.trace_output_dir=/tmp

xdebug.trace_options=0

xdebug.trace_output_name=crc32

; Profiling

xdebug.profiler_append=0

xdebug.profiler_enable=0

xdebug.profiler_enable_trigger=0

xdebug.profiler_output_dir=/tmp

xdebug.profiler_output_name=crc32

vimのpluginの設定

wget http://www.vim.org/scripts/download_script.php?src_id=7285

unzip debugger.zip

cp plugin/* ~/.vim/plugin/

firefoxAdd-onの用意

https://addons.mozilla.org/ja/firefox/addon/easy-xdebug/

インストール

■使い方

1) 最初からステップ実行

vimを開いてF5で待機

firefoxの右下の「Start xdebug session」を押して、OpenPNE3にアクセス

vim上でデバッガが開くので、F2とかF3とかF11とかctrl+wとかでいろいろ見てく

2) ブレークポイントいれてみる

例えば、 vim lib/user/opSecurityUser.class.php とか開いて、「:Bp」ってどこかの行で打ってブレークポイントを入れる

その状態でF5

firefoxの右下の「Start xdebug session」を押して、OpenPNE3にアクセス

vim上でF5でrunすると、ブレークポイントの位置まで飛ぶ

■よく使う操作

F1: resize

F2: step into(関数の中にどんどん入ってく)

F3: step over(関数の中には入らない)

F4: step out(関数の外に出る)

F5: run

F6: quit debugging

F11: get all context

F12: get property at cursor

Ctrl-w [+-](Windowの幅を広げる。WATCH_WINDOWでCtrl-w 40+とかやると良い感じ)

■どすか?

どすか?

2011-07-05

はい!OpenPNE OpenSocial Platform ユーザーズガイドを更新したよ!の巻!

はい!ギュンばんわ!

みなさんOpenSocialプラットフォーム作ってますか!?

OpenSocialアプリとか作りながら、勢い余ってOpenSocialプラットフォームとかも作るといいと思うよ!

で、OpenPNE3はOpenSocialプラットフォームになる機能が付いているわけだけど、

ドキュメントが充実してなかったので、若干充実させてみたよ!

(実運用するには若干パフォーマンス設計とかチューニングとか気を使わないと厳しいかもしれないけど)

↓な!

■opOpenSocialPlugin v1.2(Stable)版のドキュメント

http://www.openpne.jp/developer/opensocial/ja/

■opOpenSocialPlugin v1.4(Development)版のドキュメント

http://www.openpne.jp/developer/opensocial/1.4/ja/

フィーチャーフォン版のドキュメントが若干充実してないんだけど、その辺はソースとかみてな!

あと、OpenPNE3.6beta11でバンドルされてるopOpenSocialPluginは1.2.4な!

( http://trac.openpne.jp/browser/OpenPNE3/bandled-plugins-list/3.6beta11.yml 参照 )



うん、ドキュメントはSphinxで書いてる。

CentOS5とかでのビルドの仕方とかは↓な!


yum --enablerepo=epel install python-setuptools

yum --enablerepo=epel install python-docutils

easy_install sphinx

で、


git clone git://github.com/upsilon/opOpenSocialPlugin-doc.git -b version-1.2.x

cd opOpenSocialPlugin-doc.git

make

とかやると、


.build/html

htmlができる感じ。

どすか?

2011-06-30

はい!OpenPNE3のスマートフォン対応のその後!の巻!

はい!ギュンばんわ!

みなさんスマホ使ってますか!?

この前のブログでOpenPNE3のスマートフォン対応を進めてるって書いたけど、

「実際どんな感じの見栄えとか動きなの?」って感じですよね?

ということでスマホ対応を触ってみることのできるデモサイト示してみるんで、みんなも触ってみてな!

そんで何か思うことがあったらフィードバックとかくれよな!

■OpenPNE3のスマートフォン対応のデモサイト

http://touch.pne.jp/

メールアドレスsns@example.com

パスワード: password

iPhoneとかAndroidとかからアクセスしてみてな!

UA偽装とかでもOKだよ!

Mozilla/5.0 (Linux; U; Android 2.1-update1; ja-jp; HTCX06HT Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17

とかね。

インストール方法

git clone git://github.com/tozuka/OpenPNE3.git -b tz-smartphone-20110603 sns.example.com

で普通に symfony openpne:install とか。

どすか?