File mengunci pada NFS?

18

Server saya menggunakan NFS (Network File System), dan saya tidak dapat menggunakan fungsi PHP flock (). Apakah ada cara untuk mengunci file pada NFS atau apakah perlu melakukannya?

rFaktor
sumber

Jawaban:

11

Halaman manual flock(2)telah kedaluwarsa untuk waktu yang lama, tetapi sejak itu telah diperbarui untuk mengatakan (penekanan milikku):

Sejak Linux 2.6.12, klien NFS mendukung kunci flock () dengan mengemulasi mereka sebagai kunci byte-range pada seluruh file. Ini berarti bahwa kunci fcntl (2) dan flock () saling berinteraksi satu sama lain melalui NFS. Sejak Linux 2.6.37, kernel mendukung mode kompatibilitas yang memungkinkan kawanan () mengunci (dan juga kunci wilayah fcntl (2) byte) diperlakukan sebagai lokal; lihat pembahasan opsi local_lock di nfs (5).

Itu dari situs web man-pages resmi, http://man7.org/linux/man-pages/man2/flock.2.html yang menunjukkan versi baru dari man-pages 4.00

Linux 2.6.12 dirilis pada 2005.

Awalnya ini dimaksudkan sebagai komentar atas jawaban janneb, tetapi saya tidak memiliki reputasi pada saat itu. Pembaruan dokumen terjadi pada 2014: http://git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236

Josip Rodin
sumber
11

Saya tidak tahu bagaimana flock()fungsi PHP diimplementasikan, tetapi dengan asumsi itu adalah antarmuka untuk flock()syscall, maka tidak berfungsi sama sekali di seluruh NFS. Dari halaman flock()manual:

flock (2) tidak mengunci file melalui NFS. Gunakan fcntl (2) sebagai gantinya: yang berfungsi dengan baik pada NFS, mengingat versi Linux yang cukup baru dan server yang mendukung penguncian.

Dan, tentu saja, semua yang dikatakan oleh halaman manual, tidak peduli seberapa ketinggalan jaman, adalah kebenaran tertinggi.

janneb
sumber
+1, sarkasme! Butir D10 dalam FAQ NFS menguraikan.
themel
8

flock()berfungsi dengan baik di Linux NFS, termasuk dari PHP. Kami menggunakannya secara luas dan telah mengujinya dengan seksama untuk memverifikasi itu berfungsi seperti yang diinginkan. Periksa untuk melihat apakah Anda menjalankan semua layanan yang diperlukan pada klien dan server. Cari "portmapper" dan "rpc.statd". Jika mereka tidak berjalan, Anda perlu mencari tahu skrip init yang memulai mereka di distro Anda. Di distro berbasis Debian itu " /etc/init.d/portmap" dan " /etc/init.d/nfs-common".

Dari klien, jalankan " rpcinfo -u $NFSSERVER status" dan lihat apakah Anda mendapat respons. Pada pengaturan saya, saya mendapatkan "program 100024 versi 1 siap dan menunggu" sebagai hasilnya.

Oh, ingat juga bahwa dalam beberapa keadaan NFS dan statd bisa marah jika klien dan server tidak memiliki entri nama host yang dapat diandalkan untuk satu sama lain. Periksa kembali /etc/hostskedua mesin.

Insyte
sumber
1
Saya tidak benar-benar dalam posisi untuk mengubah detail spesifik server. Flock () -fungsi bahkan dinonaktifkan dari php.ini, karena itu tidak akan berfungsi, setidaknya itulah yang saya diberitahu.
rFactor
3

Hanya ingin menjawab sendiri. Solusinya dapat ditemukan di sini: http://us3.php.net/manual/en/function.flock.php#82521

rFaktor
sumber
3
Opsi kedua yang tercantum persis seperti yang saya jelaskan: menggunakan server kunci bawaan di Linux NFS. Langkah-langkah pemecahan masalah dirancang untuk menentukan mengapa itu (tampaknya) tidak berfungsi ...
Insyte