Файлові блокування на 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) байтових регіонів), які можна розглядати як локальні; див. обговорення опції 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


11

Я не знаю, як реалізується flock()функція PHP , але якщо припустити, що це інтерфейс до flock()системного виклику, то він взагалі не працює в NFS. На сторінці сторінки flock():

flock (2) не блокує файли через NFS. Замість цього використовуйте fcntl (2): це працює над NFS, враховуючи досить недавню версію Linux та сервер, який підтримує блокування.

І, звичайно, все, що говорить сторінка чоловіка, як би не застаріло, - це остання правда.


+1, сарказм! Пункт D10 в Поширених питаннях NFS .
темель

8

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на обох машинах.


1
Я насправді не в змозі змінити конкретні дані сервера. Функція flock () навіть відключена від php.ini, тому що вона б не працювала, принаймні, так мені сказали.
rFactor

3

Просто хотів відповісти собі. Рішення можна знайти тут: http://us3.php.net/manual/en/function.flock.php#82521


3
Другий перелічений варіант - саме те, що я описую: використання вбудованого сервера блокування в Linux NFS. Етапи усунення несправностей були розроблені для того, щоб визначити, чому він (мабуть) не працює ...
Insyte
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.