Відповіді:
Сторінка посібника flock(2)
давно застаріла, але з тих пір була оновлена, щоб сказати (моє наголос):
Оскільки Linux 2.6.12, клієнти NFS підтримують блокування flock (), емулюючи їх як блокування байтового діапазону у всьому файлі. Це означає, що блоки fcntl (2) та flock () дійсно взаємодіють один з одним через NFS. Оскільки Linux 2.6.37, ядро підтримує режим сумісності, який дозволяє блокувати flock () (а також блокування fcntl (2) байтових регіонів), які можна розглядати як локальні; див. обговорення опції local_lock у nfs (5).
Це з офіційного веб-сайту man-pages, http://man7.org/linux/man-pages/man2/flock.2.html, який показує нову версію з man-pages 4.00
Linux 2.6.12 вийшов у 2005 році.
Спочатку це було призначено для коментаря до відповіді janneb, але я тоді не мав репутації. Оновлення doc відбулось у 2014 році: http://git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236
Я не знаю, як реалізується flock()
функція PHP , але якщо припустити, що це інтерфейс до flock()
системного виклику, то він взагалі не працює в NFS. На сторінці сторінки flock()
:
flock (2) не блокує файли через NFS. Замість цього використовуйте fcntl (2): це працює над NFS, враховуючи досить недавню версію Linux та сервер, який підтримує блокування.
І, звичайно, все, що говорить сторінка чоловіка, як би не застаріло, - це остання правда.
flock()
добре працює в Linux NFS, в тому числі і на PHP. Ми широко використовуємо його і ретельно перевірили його, щоб перевірити, чи працює він за бажанням. Перевірте, чи використовуєте ви всі необхідні послуги як на клієнті, так і на сервері. Шукайте "portmapper" та "rpc.statd". Якщо вони не запущені, вам потрібно розібратися, який скрипт init запускає їх у своєму розпорядженні. У дистрибутивах на основі 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