[PHP-users 30566] Re: セッションを NFS 経由で共有してみました。

Shu Sawada luna @ lunanet.gr.jp
2006年 10月 20日 (金) 03:04:56 JST


さわだです。こんばんわ。

> セッションって、同時に一つのデータを更新かけるような物でも無いかなと
> 思い、無手順でRPMのPHP+NFSで使ってた時期がありました。。。
> 特に問題も起こらなかった気がします。

なるほど、気にしすぎですかね ^^;
「実際困る?」と問われると、「だって気持ち悪い」としか答えられないんですが(苦笑
簡単に排他制御できれば、それが一番すっきりです。

#複数の計算機で共有したいというニーズ自体は、そんなにレアじゃないと思うので


> ちなみに、nfslockdってこんな時に便利なものだったりしないのでしょうか?

これ、今まであまり気にしたことが無かったんですが、
(僕はただのぺちぱーなので、あまり突っ込んだこと知らないですorz)

http://www.linux.or.jp/JM/html/nfs-utils/man8/lockd.8.html
> rpc.lockd プログラムはカーネルが NFS lock manager (NLM) を自動的に起動しない
> ような場合に NLM を起動する。しかし多くのカーネルは NLM を自動的に起動するので、
> 通常 rpc.lockd は必要ない。ただし実行しても害はない。

ということで、裏方として勝手に暗躍してくれているのだと思います。
前回はこの辺気にしていなかったので、もう一度試してみました。

NFSサーバの状態
  731 ?        S      0:00 portmap
  760 ?        S      0:00 rpc.statd
 2184 ?        SW     0:00 [nfsd]
 2186 ?        SW     0:00 [nfsd]
 2185 ?        SW     0:00 [lockd]
 2187 ?        SW     0:00 [rpciod]
 2188 ?        SW     0:00 [nfsd]
                              :
 2193 ?        SW     0:00 [nfsd]
 2200 ?        S      0:00 rpc.mountd

webサーバ1,2の状態

 1366 ?        S      0:00 portmap
 1395 ?        S      0:00 rpc.statd
 1400 ?        SW     0:00 [rpciod]
 1401 ?        SW     0:00 [lockd]

192.168.227.114:/tmp/nfstest on /mnt type nfs (rw,addr=192.168.227.114)

#OSは全てVine3.2です。

という状態で、
 - 素のphp4.4.4では、セッションの排他処理はうまいこと動いてくれない
   (flock()が効いていない)
 - flock()をphp_flock() (=fcntl())に変えると、排他処理はうまく動く

というのが確認できた事実です。
nfslockdはあまり関係なさげなのかな、という気がします。

manがこう言っているので、

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/flock.2.html
> flock(2) は NFS 上のファイルのロックをしない。代わりに fcntl(2) を使用すること。
> これにより、十分に新しいバージョンの Linux と、ロック機能をサポートした
> NFS サーバを使用することにより、NFS 上でロックができる。

そんなに間違ったことをしてはいないんじゃないか、と思っているんですが、
僕のような似非にはわかんないです。何せLinux Cなんて書いたことが…。
FreeBSDあたりで試してみて、問題なく動くようなら英語圏の人に
「なんでflockなの?」って訊いてみたら、誰か教えてくれるかなぁ、、、

#プリプロセッサの分岐条件は HAVE_FCNTL を使った方がいいのかな

-- 
Shu Sawada
http://luna.lunanet.gr.jp/
http://www.cycleof5th.com/


PHP-users メーリングリストの案内