NFSのファイルロック?


18

私のサーバーはNFS(ネットワークファイルシステム)を使用しており、PHPのflock()機能を使用できません。NFS上のファイルをロックする方法はありますか、そうする必要がありますか?

回答:


11

マニュアルページflock(2)は長い間古くなっていましたが、それから次のように更新されました:

Linux 2.6.12以降、 NFSクライアントはファイル全体のバイト範囲ロックとしてエミュレートすることにより、flock()ロックをサポートしています。これは、fcntl(2)とflock()のロックがNFSを介して相互作用することを意味します。Linux 2.6.37以降、カーネルはflock()ロック(およびfcntl(2)バイト領域ロック)をローカルとして扱うことができる互換モードをサポートしています。nfs(5)のlocal_lockオプションの説明を参照してください。

これは、manページ4.00の新しいバージョンを示す公式のmanページWebサイトhttp://man7.org/linux/man-pages/man2/flock.2.htmlからのものです。

Linux 2.6.12は2005年にリリースされました。

これはもともとjannebの答えに対するコメントを意図したものでしたが、当時は評判がありませんでした。ドキュメントの更新は2014年に行われました:http : //git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236


11

PHP flock()関数がどのように実装されているかわかりませんがflock()、それがsyscall へのインターフェースであると仮定すると、NFS上ではまったく機能しません。flock()マンページから:

flock(2)は、NFS経由でファイルをロックしません。代わりにfcntl(2)を使用してください。Linuxの十分に新しいバージョンとロックをサポートするサーバーがあれば、NFSで動作します。

そしてもちろん、manページに書かれていることは、どれほど時代遅れであっても、すべてが究極の真実です。


+1、皮肉!NFS FAQの D10項目について詳しく説明しています。
-themel

8

flock()PHPを含むLinux NFSで正常に動作します。広範囲に使用し、徹底的にテストして、目的どおりに機能することを確認しました。クライアントとサーバーの両方で必要なサービスをすべて実行しているかどうかを確認します。「portmapper」と「rpc.statd」を探します。それらが実行されていない場合、どの初期化スクリプトがディストリビューションでそれらを起動するかを把握する必要があります。Debianベースのディストリビューションでは、「/etc/init.d/portmap」と「/etc/init.d/nfs-common」です。

クライアントから「rpcinfo -u $NFSSERVER status」を実行し、応答が返されるかどうかを確認します。セットアップでは、結果として「プログラム100024バージョン1の準備ができて待機中」になります。

また、状況によっては、クライアントとサーバーの両方に相互に信頼できるホスト名エントリがない場合、NFSとstatdが混乱する可能性があることにも留意してください。/etc/hosts両方のマシンで再確認してください。


1
私は実際にサーバー固有の詳細を変更する立場にはありません。flock()関数はphp.iniからも無効になります。これは機能しないためです。少なくとも私には言われています。
rFactor

3

自分に返事をしたかっただけです。解決策は次の場所にあります:http : //us3.php.net/manual/en/function.flock.php#82521


3
リストされている2番目のオプションは、まさに私が説明するものです。LinuxNFSで組み込みのロックサーバーを使用します。トラブルシューティングの手順は、それが(明らかに)...働いていなかった理由を判断するために設計されていた
Insyte
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.