Translate

PHP: запись информации в текстовый файл

Чтение и запись в текстовый файл казалось бы простейшая операция. Блокировал, открыл, записал, закрыл, снял блокировку с файла. Однако просто это только на первый взгляд….
Давайте подумаем, что произойдет, если к одному и тому же файлу одновременно обратятся несколько процессов, с целью записать туда какую-либо информацию? Могу сразу ответить: часть, либо вся информация, хранящаяся в файле будет безвозвратно потеряна. И просто блокировкой файла здесь не обойтись.


Такая задача встала передо мной при написании скрипта каталога для обмена ссылками LinkExchanger. Информация там должна была храниться именно в файлах. В итоге получилась вот такая функция, код которой приведен ниже…
01function WriteToFile ($path_to_file,$data) {
02    $lock = fopen(PATH_BLOCKFILE,"a");
03    if(flock($lock, LOCK_EX)) {
04        $tmp=fopen(PATH_TEMPFILE,"w");
05        for($i=0;$i<count($data);$i++) {
06            fputs($tmp, "$data[$i]\n");
07        }
08        fclose($tmp);
09        unlink("$path_to_file");
10        rename(PATH_TEMPFILE, "$path_to_file");
11        flock($lock, LOCK_UN);
12        fclose($lock);
13    }
14}
Давайте разберем очень подробно, как это работает.
Функция WriteToFile принимает два аргумента: путь к файлу, в который будет записана информация и собственно информация, представленная в виде массива. Нам понадобятся еще два файла, пути к которым определяются константами PATH_BLOCKFILE и PATH_TEMPFILE. Собственно из названий понятно, что первый – это некий блокирующий файл, а второй – файл для временного хранения информации.
Первое, что мы делаем – открываем на запись блокирующий файл. Далее ставим на него блокировку, и если эта операция прошла успешно, открываем на запись временный файл, в который и пишем нашу информацию.
Закрываем временный файл, удаляем исходный файл и переименовываем временный файл, давая ему имя исходного. Далее снимаем блокировку с блокирующего файла и закрываем его.
Это все. Проверено годами работы в условиях массового использования и на самых различных хостингах.
Единственное, за чем надо следить, чтобы при добавлении информации не было превышено допустимое дисковое пространство.

http://www.linkexchanger.su/2008/10.html

Комментариев нет:

Отправить комментарий

Постоянные читатели