回答:
マニュアルページ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
PHP flock()
関数がどのように実装されているかわかりませんがflock()
、それがsyscall へのインターフェースであると仮定すると、NFS上ではまったく機能しません。flock()
マンページから:
flock(2)は、NFS経由でファイルをロックしません。代わりにfcntl(2)を使用してください。Linuxの十分に新しいバージョンとロックをサポートするサーバーがあれば、NFSで動作します。
そしてもちろん、manページに書かれていることは、どれほど時代遅れであっても、すべてが究極の真実です。
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
両方のマシンで再確認してください。
自分に返事をしたかっただけです。解決策は次の場所にあります:http : //us3.php.net/manual/en/function.flock.php#82521