–абота с файлами: php-блокировка

ƒетальное описание поверка счетчиков гор€чей воды краснодар на сайте.

PHP - √рамотна€ работа с файлами: »сключительна€ блокировка файлов

   »так, начнем с того, что же такое исключительна€ блокировка файла и дл€ чего она необходима. Ќе секрет, что множество сайтов хран€т свою информацию не в базах данных, а в простых тестовых файлах. «десь мы не будем спорить, что лучше и хуже, мы просто поговорим о специфике работы с данными, хран€щимис€ в файлах. Ёти данные могут иметь различные форматы, различные структуры, но так или иначе манипул€цию этими данными мы должны вз€ть на себ€. Ќужно четко понимать, что это бывает иногда сложней, чем кажетс€ на первый взгл€д. ƒействительно, когда ¬ы тестируете свои скрипты, все кажетс€ идеальным: информаци€ добавл€етс€, информаци€ удал€етс€... Ќо стоит только начать работу в сети и ситуаци€ может кардинально изменитьс€. ¬ ситуации, когда со скриптом работает одновременно большое количество людей очень важно не потер€ть контроль над операци€ми работы с файлом. ¬озможны ситуации, когда двое или более людей одновременно запрос€т операции записи в файл и произойдет серьезный сбой, который повлечет потерю информации. ћодель исключительной блокировки предотвращает подобные ситуации, "разрулива€" процессы , работающие с файлом и не дава€ им одновременно выполн€ть опасные операции.

   ќбычно работа с файлом (небезопасна€ модель без блокировки файла) представл€ет собой последовательность действий в виде: открытие файла (получение его дескриптора), работа с содержимым, закрытие файла. » в самом распространенном варианте выгл€дит так:

<?
$fp
= fopen ("path_to_file","a");//ќ“ –џ“»≈
fputs($fp ,"$data\r\n");//–јЅќ“ј — ‘ј…Ћќћ
fclose ($fp);//«ј –џ“»≈
?>

   «десь мы открыли файл в режиме добавлени€ информации в конец файла, записали в него порцию информации $data и затем закрыли его (ѕредполагаетс€, что у нас есть права на запись в файл). Ёто самое простое и самое первое, что нам могло прийти в голову и что мы реализовали. ≈сли вы уверены, что никаких проблем с файлом не возникнет или что у вас не так много посетителей, чтобы что-то сломалось, то это ваше право - можете закрыть статью и жить спокойно! ;) Ќо нужно что-то делать. ќдним из примеров трагедий может служить сайт https://manlix.ru, в котором посто€нно "падает" форум и/или счетчик посетителей. я, конечно, не берусь судить, что только некорректна€ работа с файлами тому виной, но, по-моему, это очевидно. ѕока число посетителей было сравнительно небольшим, все корректно функционировало, как только иногда одновременно стало по€вл€тьс€ до 10 пользователей одновременно, начались казусы с счетчиком и форумом.  ак же это преодолеть? ќказываетс€ просто, всего лишь добавив несколько строк в операцию работы с файлами:

<?
$fp
= fopen ("path_to_file","a");//открытие
flock ($fp,LOCK_EX);//ЅЋќ »–ќ¬ ј ‘ј…Ћј
fputs($fp ,"$data\r\n");//работа с файлом
fflush ($fp);//ќ„»ў≈Ќ»≈ ‘ј…Ћќ¬ќ√ќ Ѕ”‘≈–ј » «јѕ»—№ ¬ ‘ј…Ћ
flock ($fp,LOCK_UN);//—Ќя“»≈ ЅЋќ »–ќ¬ »
fclose ($fp);//закрытие
?>

   ¬ данном примере мы открыли файл дл€ добавлени€ в него информации ѕредполагаетс€, что у нас есть права на запись в файл). «атем применили исключительную блокировку и тем самым сделали наш скрипт единственным процессом, который в текущий момент имеет доступ к файлу. Ѕлокировка действительна все врем€ от выполнени€ функции flock ($fp,LOCK_EX) и до выполнени€ flock ($fp,LOCK_UN). ћежду этими функци€ми наход€тс€ операторы, выполнение которых будет "безопасным" дл€ файла. ƒругие процессы смогут получить доступ к файлу не раньше сн€ти€ блокировки. ¬ажным моментом €вл€етс€ применение функции fflush ($fp). “ранзакции изменени€ данных могут быть записаны с специальный файловый буфер и сброшены на диск позже, когда блокировка будет уже сн€та и снова будет опасность сбо€ в работе. ѕоэтому данной функцией мы принудительно записываем изменени€ на диск, сбрасыва€ содержимое буфера. ≈ще одним не менее важным моментом €вл€етс€, само открытие файла! ћы не случайно используем режим "a" ("a+"). ≈сли нам будет необходима запись в начало файла с удалением предыдущего содержимого, то следует воздержатьс€ от применени€ режима "w" ("w+"), поскольку очищение файла предполагает удаление не только содержимого, но и самого файла с последующим созданием аналогичного. “ак как этот процесс будет выполнен до исключительной блокировки, то также существует веро€тность сбо€ в работе. ¬ данном случае стоит примен€ть следующий прием :

<?
$fp
= fopen ("path_to_file","a");//открытие
flock ($fp,LOCK_EX);//блокировка файла
ftruncate ($fp,0);//”ƒјЋя≈ћ —ќƒ≈–∆»ћќ≈ ‘ј…Ћј
fputs($fp ,"$data\r\n");//работа с файлом
fflush ($fp);//очищение файлового буфера и записьв файл
flock ($fp,LOCK_UN);//сн€тие блокировки
fclose ($fp);//закрытие
?>

   «десь мы открыли файл дл€ записи в него, затем применили исключительную блокировку, и только уж потом применили функцию ftruncate ($fp,0) котора€ выполнила так необходимую нам очистку файла от содержимого. ¬от вроде бы и все, что € хотел вам дл€ начала рассказать! ”спехов ¬ам в нашем нелегком труде! ƒо новых встреч, до новых статей!


јвтор Art1st




ѕри перепечатке информации делайте, пожалуйста, ссылку на наш сайт (либо поделитьс€ вконтакте, гугл+ или делитесь в одноклассниках статьЄй). —пасибо!

»сточник: www.wr-script.ru©, 2004-2023г.

ƒелитесь с друзь€ми в соцсет€х. јктивные комментаторы получают свежие скрипты и бесплатные доработки от WR-Script.ru!

¬ернутьс€ к стать€м помощи WEB-мастеру
WR-–°—З—С—В—З–Є–Ї