タグ

ブックマーク / msakamoto-sf-2007-to-2011.hatenadiary.jp (4)

  • sessionのデフォルトファイルハンドラとflock - ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

    PHPでのflockについてこの前調べた。で、PHPはセッションデータをどのように永続化するのかについてモジュール化できるようになっている。これをセッションハンドラモジュールと呼称しておく。PHPはファイルに保存して永続化するファイルモジュールと、ユーザー定義 関数によりPHPスクリプトレベルで永続化処理を自由に実装可能なユーザー関数モジュールの二つをデフォルトで提供している。このうちflock()が影響するのはファイルモジュールである。これがどうなっているのか気になって、調査した。 先に結論を述べる。 ファイルモジュールはsession_start()の呼び出しによりファイルにflock()による排他ロックを取得し、session_destroy()あるいはリクエスト処理の完了時などにclose()(Win32においては明示的にflock(LOCK_UN))を行い排他ロックを解除している

    sessionのデフォルトファイルハンドラとflock - ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)
    rsky
    rsky 2008/02/10
    セッションハンドラの実装について
  • flock(),fcntl()とアドバイザリ・ロックについての短いまとめ - ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

    flock(), fcntl()とロックについては、来であれば各コンポーネント - PHP/Perl/BSD/LinuxKernel/glibc などのソースコードを丁寧に追う必要があるが、凡夫はそこの手前で満足する。また、BSD/Linuxについてはflock()によりfork()/dup2()などファイル記述子が複製されるケースでロックの継承が可能だが、それ以外の*nixについてはマニュアルや実装を調べる必要がある。 結局POSIX/SUSで規定されるロックは全て「アドバイザリ・ロック」(advisory lock)と言う種類に分類される。「強制ロック」(mandatory lock)はBSD/Linuxでは実装されているものの、その他*nix系OSでの実装状況は当てにしない方が賢明である。 またRead/Writeバッファも密接に絡むらしい。殊PHPについて言えば、 http://

    flock(),fcntl()とアドバイザリ・ロックについての短いまとめ - ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)
    rsky
    rsky 2008/02/05
  • flock(), fcntl() - ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

    Xhwlayとか、YakiBikiで使おうと思ってたチケットトークンの扱いで気になってたものの一つに、flockの範囲の扱いがあった。つまるところ、ファイルをどうロックしてどこでアンロックするのが良いのか?という話。 例えば、次に示すPHPコードはチケットの扱いに問題が発生する。 <?php // チケットIDを取得。ここの部分は話題の範囲外なので省略。 $tickt_id = ... ; // 現在時刻の取得 $now = time(); // チケットファイル名を返却する関数。同様に実装省略 $ticket_file = get_ticket_file($ticket_id); // チケットの最終更新時刻を取得 $mtime = filemtime($ticket_file); // (A1) if ($mtime === false) { // 存在しない場合は無効なチケットIDと

    flock(), fcntl() - ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)
    rsky
    rsky 2008/02/05
  • 2007-09-20

    非常に単純で、コードをべた書きできないからだと思う。文字列として渡さなければならないので、$ や " や ' を一々丁寧にエスケープしないとならないのが非常に、面倒くさい。 Perlであれば、 eval { my $i = 0; ... }; die $@ if $@;みたく書けるし、また、無名サブルーチン/関数も my $lambda = sub() { my ($a, $b, $c) = @_; ... $a + $b; };と書ける。 続きを読む PHPのスクリプトは、 <?php ... ?>の枠の「外」については、HTMLを想定してそのまま出力する。つまり、使いようによってはPerlRubyのDATAセクションのような使い道ができるはず。これを逆手に取り、出力バッファリング関数で意図的にこの枠外の文字列を取得してしまう。 論より証拠。 hoge1.php : <?php $i

    2007-09-20
    rsky
    rsky 2007/09/21
    <?php ... ?> の外側にコードを書いてキャプチャ
  • 1