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時間経ったら削除する例。
プロセスの優先度は低めにしてある。

都道府県コードの仕様

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

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

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

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アドレスだけ確認君

ソース

PHPのsleepとusleepのメモ

sleep(1) = usleep(1000000)

usleepの引数はマイクロ秒。

PHPのSession IDの長さを変更する

PHPのセッションIDの生成方法、長さを変えるにはphp.iniのsession.hash_bits_per_characterを変更する。

php.iniには以下のような説明が書いてある。

; Define how many bits are stored in each character when converting
; the binary hash data to something readable.
;
; 4 bits: 0-9, a-f
; 5 bits: 0-9, a-v
; 6 bits: 0-9, a-z, A-Z, “-”, “,”
session.hash_bits_per_character = 4

session.hash_bits_per_characterの値とセッションID文字数の対応

session.hash_bits_per_character
4 32
5 26
6 22

テストスクリプト

ソースコードのスペルチェック

http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Aspell#ve0ff963

ソースコードにある英単語のスペルチェック。

PHPやHTMLなど、どんなファイルでもできるはず。

findの引数でチェックしたいファイルを指定してね。

 % find modules libs batch  -name '*.php' |sed "s/[A-Z][a-z]/ \0/g" | tr '[A-Z]' '[a-z]' |aspell -l |sort|uniq
acc
addphp
api
...
....

自分で、単語を登録したい場合は、ここら辺を参照してみてください。

PHPソースコードのスペルチェッカ

有料だとあるんだけど、無料が無い。

PHPUnitから実行したいからコマンドラインで動いて欲しい。

 

チェックして欲しい項目

  • 変数
  • クラス
  • ファイル名
  • メソッド名

 

コメント内はいいや。

UNIXタイムスタンプからユーザフレンドリーな日時


http://www.tymy.net/~matsu/timestamp_to_date.php

今までありそうでなかったサービス。
ただのUNIXタイムスタンプを見やすい形式に変換するだけ。

今作ってるECシステムが。。。

結構でかくなってきて、辛いなぁ。

778 クラス
632 HTMLテンプレート
59252 ステップ

 

リンク