Я создал чат, который использует PHP для записи в текстовый файл, а затем текстовый файл читается пользователю. Мне много раз говорили, что если несколько пользователей одновременно пишут в один и тот же файл на моем сервере, файл может быть поврежден.
Как это вызвано и как это происходит?
Это связано не с PHP, а с тем, как файлы хранятся на диске и как они читаются и записываются операционной системой.
Драйверы жестких дисков обладают определенным интеллектом для оптимизации собственной производительности. Но в конце концов, они просто глупые машины.
Если процесс (или два, или более) просит ОС записать значительный объем данных (большой пост от пользователя A) в файл, драйвер может захотеть разбить эти данные на несколько частей (в соответствии с размером блока устройства). ) для оптимизации производительности жесткого диска. Написание чанка занимает время. Даже если это доля секунды, это все еще длительность, в течение которой может появиться другой процесс и попросить ОС записать что-то еще (короткое приветствие от пользователя B) в тот же файловый дескриптор. ОС не достаточно умна, чтобы понять намерения вашего приложения, она просто следует инструкциям, которые она выдает. И записывает данные пользователя B. Затем он переходит к записи следующего фрагмента данных пользователя А. В результате в файле сохраняются следующие данные:
Сообщение пользователя A Сообщение пользователя A Сообщение пользователя A Сообщение пользователя A ПОЛЬЗОВАТЕЛЬ B ‘s QUICKY Сообщение пользователя A Сообщение пользователя A Сообщение пользователя A Сообщение пользователя
На первый взгляд это может показаться безобидным, но что, если вы, например, добавите многобайтовую кодировку символов? Конец порции пользователя A может находиться в середине символа, что сделает его неразборчивым и едва восстанавливаемым.
Других решений пока нет …