Чтение и запись в текстовый файл казалось бы простейшая операция. Блокировал, открыл, записал, закрыл, снял блокировку с файла. Однако просто это только на первый взгляд….

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

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

function WriteToFile ($path_to_file,$data) {
	$lock = fopen(PATH_BLOCKFILE,"a");
	if(flock($lock, LOCK_EX)) {
		$tmp=fopen(PATH_TEMPFILE,"w");
		for($i=0;$i<count($data);$i++) {
			fputs($tmp, "$data[$i]\n");
		}
		fclose($tmp);
		unlink("$path_to_file");
		rename(PATH_TEMPFILE, "$path_to_file");
		flock($lock, LOCK_UN);
		fclose($lock);
	}
}

Давайте разберем очень подробно, как это работает.
Функция WriteToFile принимает два аргумента: путь к файлу, в который будет записана информация и собственно информация, представленная в виде массива. Нам понадобятся еще два файла, пути к которым определяются константами PATH_BLOCKFILE и PATH_TEMPFILE. Собственно из названий понятно, что первый – это некий блокирующий файл, а второй – файл для временного хранения информации.

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

Поделиться в FaceBookПоделиться ВКонтактеДобавить в TwitterПоделиться в Моём МиреСохранить закладку в GoogleОтправить в Живую ленту GoogleДобавить в Яндекс.ЗакладкиПоделиться в ОдноклассникахОпубликовать в LiveJournal