PHPセッションのGC

PHPのセッションハンドラをデフォルトで使っている場合のガーベージコレクタ(GC)の話。

PHPはサーバ上で保存してあるセッション情報を保存してあるファイルをを定期的に削除している。
削除するタイミングはPHPが起動する時、HTTPリクエストまたはコマンドラインからPHPが起動した際に一定の確立でGCが起動するようになっている。Javaのアプリケーションサーバならメモリ上にJVMが常駐しているからプログラムの起動とは非同期にできるが、PHPは同期で処理している。そのため、PHPではGCが起動したときにプログラムの実行時間が長ってしまう。

よって、大規模サイトになったときには必然的にセッションファイルが扱うセッションが多くなるため、GCにかかる時間が長くってしまうから、GCはPHPに任せないで自前で用意すべき。

PHPのGCを制御する設定はphp.iniに記載されている以下の3つ。

session.gc_probability = 1
session.gc_divisor     = 1024
session.gc_maxlifetime = 1440

GCの起動確立は、gc_divisor 分のgc_probability。上記の例では1/1024の確立でGCが起動する。
セッションファイルの最終変更時間がgc_maxlifetime秒以前だったらセッションを削除する。
(PHP4.2.3以降はファイルの最終更新日、それより前は最終アクセス時間)

gc_probabilityを0にすればPHPのGCは無効になる。

以下は、GCをcronで一定時間に削除する例。

*/10 * * * * daemon nice -n 18 find /tmp -type f -name "sess_*" -mmin +120 -exec rm {} \;

上記の例では、10分に1回GCを起動し、最終変更時間から2時間経ったら削除する例。
プロセスの優先度は低めにしてある。

svnコマンドでロールバック

コマンドラインでロールバックの方法を発見。

ロールバックそのものはできないけど、merge -> commit で似たことができる。
TortoiseSVNの「Revert changes from this revision」をと同義です。

$ svn merge -c -303 http://svn.example.com/repos/calc/trunk
U integer.c

$ svn status
M integer.c

$ svn diff
…
# verify that the change is removed
…

$ svn commit -m "Undoing change committed in r303."
Sending integer.c
Transmitting file data .
Committed revision 350.

mergeスイッチにはたくさんオプションがあって、様々なロールバックを行える。

Valid options:
  -r [--revision] ARG      : ARG (some commands also take ARG1:ARG2 range)
                             A revision argument can be one of:
                                NUMBER       revision number
                                '{' DATE '}' revision at start of the date
                                'HEAD'       latest in repository
                                'BASE'       base rev of item's working copy
                                'COMMITTED'  last commit at or before BASE
                                'PREV'       revision just before COMMITTED
  -c [--change] ARG        : the change made by revision ARG (like -r ARG-1:ARG)
                             If ARG is negative this is like -r ARG:ARG-1
  -N [--non-recursive]     : obsolete; try --depth=files or --depth=immediates
  --depth ARG              : limit operation by depth ARG ('empty', 'files',
                            'immediates', or 'infinity')
  -q [--quiet]             : print nothing, or only summary information
  --force                  : force operation to run
  --dry-run                : try operation but make no changes
  --diff3-cmd ARG          : use ARG as merge command
  --record-only            : mark revisions as merged (use with -r)
  -x [--extensions] ARG    : Default: '-u'. When Subversion is invoking an
                             external diff program, ARG is simply passed along
                             to the program. But when Subversion is using its
                             default internal diff implementation, or when
                             Subversion is displaying blame annotations, ARG
                             could be any of the following:
                                -u (--unified):
                                   Output 3 lines of unified context.
                                -b (--ignore-space-change):
                                   Ignore changes in the amount of white space.
                                -w (--ignore-all-space):
                                   Ignore all white space.
                                --ignore-eol-style:
                                   Ignore changes in EOL style
                                -p (--show-c-function):
                                   Show C function name in diff output.
  --ignore-ancestry        : ignore ancestry when calculating merges
  --accept ARG             : specify automatic conflict resolution action
                            ('postpone', 'base', 'mine-full', 'theirs-full',
                             'edit', 'launch')
  --reintegrate            : lump-merge all of source URL's unmerged changes

http://www.rustyrazorblade.com/2007/04/06/how-to-roll-back-commits-to-an-earlier-version-of-a-repository-in-svn/


あるコミットを無かったことにする方法が書いてある。
スマートではないけど、正攻法。ダウンタイムあるのが良くない
http://timhatch.com/ark/2006/04/18/howto-svn-commit-rollback

Wikipediaに寄付してみた

Wikipediaのおかげで今までどれだけの無駄な労働を節約できたことか。
感謝の意を表して。

Wikipedia Affiliate Button

すし幸

昆布じめ 待つこと1ヶ月以上!すし幸の昆布じめが届いた!!

昆布のうまみが刺身に染みててすごいおいしい!味付けは全然してないので、刺身醤油とわさびが今のところベストな組み合わせ!

賞味期限が冷蔵だと1週間、冷凍で1ヶ月しか持たないのが難点。保存料は使ってないみたいだね。

今のところの感想。
x 的鯛
o ます
o かじき
o いか

もっと詳しく >>

Wordpress 2.7-Beta2にしてみた

wordpress2.7

Wordpress 2.7が11月10日にリリースされる予定だったけど、2週間ほど延期らしい。

海外サイトで2.7の評判を見ているとかっこいいデザインなので早速使ってみた。

使ってみた感想。
良い点

  • フロントエンドの描画が早くなった。今までコメントが10個ぐらいつくと表示に10秒近くかかっていた
  • バックエンドのデザインがかっこよくなった。
  • Gravatarが搭載された

悪い点

  • テーマがまだまだ対応していない。
  • Simple Tagsプラグインが動かなくなる。代わりに別のプラグインを入れろと催促されるが、Simple Tagsでつけたタグが引き継がれない。→Simple Tagsのソースコード内にバージョンチェックしているところがあるので、改変すれば使える

正式リリースが楽しみです。
もっと詳しく >>

都道府県コードの仕様

都道府県のIDがJIS X 0401によって決められていた。
システムで都道府県のIDを扱うときにはこれを利用した方がいいね。

北海道
青森県
岩手県
宮城県
秋田県
山形県
福島県
茨城県
栃木県
群馬県
埼玉県
千葉県
東京都
神奈川県
新潟県
富山県
石川県
福井県
山梨県
長野県
岐阜県
静岡県
愛知県
三重県
滋賀県
京都府
大阪府
兵庫県
奈良県
和歌山県
鳥取県
島根県
岡山県
広島県
山口県
徳島県
香川県
愛媛県
高知県
福岡県
佐賀県
長崎県
熊本県
大分県
宮崎県
鹿児島県
沖縄県

上記に追加して、99はその他と定義されているっぽい。

animoto

※かっこいい音楽が鳴ります

The Tokyo Towersゲストルーム

The Tokyo Towers

26Fゲストルームからの眺め。
もっと高層階から写真撮りたい!

PHPで2GB以上のファイルを扱う

x86のLinuxにてPHPを普通にコンパイルすると2GBまでのファイルしか扱えない!OSやファイルシステムが対応していても、だめ。普通にコンパイルするとファイルシステム周りは32bit空間(ファイルシステムだと約2GB分)しか扱えないらしい。

アプリケーションからログを出力してて、気づかないうちに2GBになったら、アプリケーションが途中で止まっちゃう。

ここに、対応策が書いてあった。
http://bugs.php.net/bug.php?id=36478

gccへ”-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64″というフラグをgccへ渡すと、ファイルシステム周りのライブラリは64bit空間を利用できるようになる。

例:

% CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" ./configure...

リモートホストのIPアドレスを表示。

サーバのアクセス制限をするときに自分のグローバルIPアドレスを調べたいときあるよね。
いちいち「確認君」というフレーズをぐぐるのがめんどくさいから、スクリプト作ってブックマーク入れておく方が楽。

グローバルIPアドレスだけ確認君

ソース

 

リンク