web-dev-qa-db-ja.com

NFSのファイルロック?

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

18
rFactor

自分に答えたかっただけです。解決策はここにあります: http://us3.php.net/manual/en/function.flock.php#82521

3
rFactor

PHP flock()関数の実装方法はわかりませんが、これがflock() syscallへのインターフェースであるとすると、すべてNFS経由。flock()マンページから:

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

そしてもちろん、manページに書かれていることは、どれほど古くても、究極の真実です。

11
janneb

マニュアルページflock(2)は長い間古くなっていますが、それ以降は次のように更新されています(私の強調):

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

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

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

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

11
Josip Rodin

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

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

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

8
Insyte