Сенаріо:
У вас є файл із рядком (середнє значення речення) у кожному рядку. Для аргументів давайте скажемо, що цей файл має розмір 1 Мбіт (тисячі рядків).
У вас є сценарій, який читає файл, змінює деякі рядки в документі (не тільки додаючи, але й видаляючи та змінюючи деякі рядки), а потім перезаписує всі дані новими даними.
Питання:
У PHP, OS або httpd тощо на сервері вже є системи для зупинки таких питань (читання / запис на пів шляху через запис)?
Якщо це так, поясніть, як це працює, та наведіть приклади чи посилання на відповідну документацію.
Якщо ні, чи є такі речі, які я можу ввімкнути або налаштувати, наприклад, заблокувати файл до завершення запису та зробити так, щоб усі інші читання та / або запис провалилися, поки попередній сценарій не закінчив писати?
Мої припущення та інша інформація:
На розглянутому сервері працює PHP та Apache або Lighttpd.
Якщо скрипт викликає один користувач і знаходиться на півдорозі запису у файл, а інший користувач читає файл у той самий момент. Користувач, який його прочитає, не отримає повного документа, оскільки він ще не був написаний. (Якщо це припущення неправильне, будь ласка, виправте мене)
Мене стосується лише написання та читання PHP у текстовому файлі, зокрема, функції "fopen" / "fwrite" і головним чином "file_put_contents". Я переглянув документацію "file_put_contents", але не знайшов рівня деталізації або гарного пояснення того, що є чи робить прапор "LOCK_EX".
Сценарій є прикладом найгіршого сценарію, коли я вважаю, що ці проблеми частіше виникають через великий розмір файлу та спосіб редагування даних. Я хочу дізнатися більше про ці проблеми і не хочу і не потребую відповідей чи коментарів, таких як "використовувати mysql" або "чому ти це робиш", тому що я цього не роблю, я просто хочу дізнатися про читання / запис файлів з PHP і, здається, не шукають у потрібних місцях / документації, і так, я розумію, PHP не є ідеальною мовою для роботи з файлами таким чином.
file_put_contents()
це просто обгортка для fopen()/fwrite()
танцю, LOCKEX
робить те саме, як якщо б ви подзвонили flock($handle, LOCKEX)
.