Сенарио:
У вас есть файл со строкой (средняя стоимость предложения) в каждой строке. В качестве аргумента, скажем, этот файл имеет размер 1 МБ (тысячи строк).
У вас есть скрипт, который читает файл, изменяет некоторые строки в документе (не только добавляет, но и удаляет и изменяет некоторые строки), а затем перезаписывает все данные новыми данными.
Вопросы:
У «серверного» PHP, ОС или 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)
.