FOPEN FLOCK FWRITE примеры запись в файл PHP блокировка файла

В сегодняшней короткой статье, рассмотрим примеры работы с файлами в PHP. А именно процесс открытия файла, записи данных, чтение из файла и такой не маловажный аспект работы с файлами – как временная блокировка.
Первое, что необходимо нам для работы с любым файлом, открыть его. Для этой цели существует функция fopen:
$file = "new_file.txt";
$fp = fopen($file, "w");

в данном примере мы открыли файл new_file.txt для записи. Параметр «w» расшифровывается как запись, при этом все данные в файле (если таковые существовали) будут стерты, а если файл не существует , он будет создан (если у скрипта достаточно прав, если директория, в которой создается файл, имеет права chmod 0777).
Итак мы открыли файл для записи, самое время в него что-то записать:
$text = "Hello World!";
fwrite($fp, $text);

как Вы видите из примера, fwrite используется для записи в открытый ранее файл $fp данный $text.
Данные записаны , но для грамотного завершения, открытый файл нужно закрыть, с помощью функции fclose:
fclose($fp);
Какие ещё тонкости могут возникнуть при записи в файл? Возможно Вам захочется заблокировать файл в момент когда в него происходит запись. Это делается для предотвращения ошибок с помощью функции flock (например: файл одновременно запросится несколькими пользователями и данные будут искажены или потеряны):
flock($fp, LOCK_EX); /* закрывает файл на замок, актуально вставлять в код перед записью fwrite */
flock($fp, LOCK_UN); /* открывает файл, заблокированный ранее, актуально вставлять перед закрытием файла fclose */

Теперь, обладая всей необходимой информацией, напишем свою собственную функцию для корректной записи данных в произвольный файл:
function writeInFile($file='',$text='',$debug=0)
{
$fp = fopen($file, "w"); /* открыли файл для новой записи */
if (flock($fp, LOCK_EX)) {
/* если файл возможно заблокировать, значит всё в порядке */
ftruncate($fp, 0); // предварительная очистка файла, на всякий случай
fwrite($fp, $text); // пишем в файл данные
fflush($fp); // очищаем буфер
flock($fp, LOCK_UN); // открываем блокировку
} else {
if($debug==1) echo "Произошла ошибка блокировки. Возможно файл отсутствует и его нельзя создать (проверьте права на файл и директорию), либо файл уже заблокирован."; // здесь выводится сообщение об ошибке , в случае если файл не удалось заблокировать перед записью. Сообщение появится только в режиме отладки , когда Вы указываете $debug = 1
}
fclose($fp); /* закрываем открытый файловый дескриптор */
}
writeInFile('/home/weblomaster.ru/tmp/new_file.txt','Hello World!'); /* вызываем нашу функцию и пишем в файл текст Hello World! Лучше всего указывать полный путь до файла, хотя если позволяют права и скрипт находится в тойже директории что и файл для записи, можно опустить полный путь и указать только имя файла, в нашем случае это new_file.txt */

Как проверить состояние блокировки для файла (заблокирован он в данный момент или нет)? Для этого снова используем flock и параметр LOCK_NB:
$fp = fopen('/home/weblomaster.ru/tmp/new_file.txt', 'r+'); /* открываем файл только для чтения, параметр "r+" означает - чтение и дозапись , указатель помещается в начало файла */
if(!flock($fp, LOCK_EX | LOCK_NB)) {
echo 'С файлом что-то не так';
exit(); /* если блокировка не получена, скрипт завершает работу */
}
flock($fp, LOCK_UN);
echo "Всё нормально!";
fclose($fp);

Опубликовано 26.01.2014 в 04:03 · Автор Вебдизайнеру, сисадмину, вебмастеру · Ссылка
Рубрики: PHP программирование · Теги: , , , , , , , , , , ,