ProfiPHPProfiPHP
Категория: Полезное в PHP

Безопасная работа с файлами в PHP

В данной статье вы узнаете, что представляет собой безопасная работа с файлами в PHP. Речь пойдет о блокировании. Думаю, что очень важно разобраться с безопасным чтением, обновлением и записью данных в файл, если хотите, чтобы скрипт работал устойчиво и долго.

Предположим ситуацию, когда несколько пользователей одновременно записывают некоторую информацию в общий текстовый файл. Рассчитывая на аппаратную платформу сервера, можно быть уверенным, то никакого затирания файла не произойдет, потому что все происходит очень быстро, и вероятность того, что пользователи сделают это именно в ту самую долю секунды, очень маленькая. Но все же, будем полагаться на удачу, а обезопасим себя от такой ситуации.

Для этого в PHP используются функции блокировки файла. Принцип заключается в следующем:

Один пользователь открывает файл, и в момент открытия, файл блокируется для второго пользователя. Второй пользователь, ждет, пока файл не освободиться, и только потом может выполнить нужную операцию. То есть с файлом может работать только один пользователь, что и представляет собой безопасную работу с файлами. Операции чтения и записи выполняются на сервере с огромной скоростью, никто из пользователей не почувствует задержки.

На данный момент, PHP сам не занимается блокировкой файлов, а все это возложено на плечи программистов.

Перечитав огромное количество форумов, такое ощущение, что никто толком не знает до конца, как нужно работать с блокировкой, судя по способам побороть эту проблему.

Некоторые делают так: открывают на запись блокирующий файл. Далее ставят на него блокировки, и если эта операция прошла успешно, открывают на запись временный файл, в который и пишут нужную информацию. Затем закрывают временный файл, удаляют исходный файл и переименовывают временный файл, давая ему имя исходного. Далее снимают блокировку с блокирующего файла и закрываю его.

Все это конечно хорошо, но я бы сравнил это с маршрутом Киев - Москва через Минск. Во-первых, это и намного дольше времени займет, во-вторых, гораздо больше использованных ресурсов и средств.

Видел случаи, когда используют Функцию Sleep, которая задерживает выполнение программы на данное количество секунд. Скажу прямо, все эти выдумки только замедляют работу скрипта, а затем все обсуждают, что работа с файлами медленная, и не эффективна! А все из за того, что скрипты вовсе не оптимизированы.

Для чтения данных использования функции блокировки можно опустить, поскольку нет опасности повреждения данных при одновременном чтении файла несколькими процессами. Блокировка используется для записи, так как (если не приняты меры предосторожности) одновременная запись данных в файл несколькими процессами опасен. Так же опасно считывать данные, если другой процесс в это же время записывает информацию в тот же файл.
Сейчас я опишу, как правильно нужно использовать блокировки файлов во время работы. Делайте так, и проблем не будет, по крайней мере, у меня еще никогда не было случаев, чтобы испортился файл.

Функция Flock создает для файла флаг, указывающий на то, что с файлом идет работа. При этом другой скрипт или другая программа, которая умеет распознавать подобный флаг, сделает соответствующие выводы и содержимого файла не нарушит.

Нужно помнить, что функция ничего не блокируют. Это только флажки, проверка которых лежит на плечах программистов. То есть, во всех скриптах, которые работают с определенным файлом, нужно так же обязательно использовать Flock!

И так, давайте разберем все на примере.

Запись данных в файл осуществляется так:
$f = fopen( $file, 'a+' );
flock( $f, LOCK_EX );
// Программа, которая выполняет операцию с файлом
flock( $f, LOCK_UN );
fclose( $f );
А так нужно считывать данные:
$f = fopen( $file, 'r' );
flock( $f, LOCK_SH );
// Здесь мы уверены, что в файл никто не пишет
flock( $f, LOCK_UN );
fclose( $f );
Вот и вся техника безопасности при работе с файлами.

Добавить комментарий

Имя:
Текст комментария: