[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Web - программирование / PHP /

PHP: Безопасная работа с файлами. Пример счетчика

Источник: www.gcmsite.yaroslavl.ru

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

Рассмотрим пример простейшего счетчика:

$cf1 = @file ("counter.txt");
 $co = trim($cf1[0])+1;
 $cf2 = @fopen ("counter.txt", "w");
 fput($cf2, $co);
 fclose ($cf2);

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

Например, первый скрипт прочитал значение счетчика, увеличил на единицу и открыл файл для перезаписи. В этот момент второй скрипт прочитал значение счетчика из пустого файла (параметр "w" указывает на то, что открываемый файл становится пустым). Ошибочное чтение обнулило значение счетчика во втором скрипте. Первый скрипт записал в открытый файл правильное значение счетчика и закрыл файл. Второй скрипт увеличил значение счетчика на единицу: 0 + 1 = 1 и записал в файл это число. Таким образом, мы потеряли правильное значение счетчика.

Эту проблему можно решить, используя функцию flock(), но она не будет работать под IIS от Microsoft.

Воспользуемся другим способом: будем создавать файлы-флаги. Алгоритм простой: создаем файл-ловушку, работаем с нужным файлом, удаляем файл-ловушку. 

cre_t("_counter");
 . . . работаем со счетчиком
 del_t("_counter");

Рассмотрим подробнее функции cre_t() и del_t().  # Создаем замок на определенный файл
 function cre_t($fn){
   $trp_p = 5;
   $present = 1;
   while ($present == 1){
     $i = 0;
     $j = rand (2000, 5500);
     while ($i<$j){
       $i = $i + 1;
     }
     if (!file_exists($fn)){
       $mf = @fopen($fn, "w");
       @fclose($mf);
       @fflush($mf);
       @chmod($fn, 0666); # Меняем атрибуты
       $present = 0;
     }
     else{
       if ((time() - @filemtime($fname))>$trp_p){
         @unlink ($fname);
       }
     }
     clearstatcache($fname);
   }
   return 1;
 }

 # Снимаем замок с файла
 function del_t($fn){
   return @unlink ($fn);
 }

Цикл в функции cre_t() работает до тех пор, пока существует файл-ловушка. Чтобы не происходило бесконечного зацикливания, добавлена проверка времени создания файла-ловушки. Если файл-ловушка существует более 5 секунд, то удаляем его самостоятельно.

Установка атрибута 0666 на файл-ловушку позволяет различным скриптам удалять этот файл.

Описанный метод обеспечивает приемлемую защиту для безопасной работы с файлами. Но, разумеется, 100% безопасность возможна лишь с использованием базы данных и встроенной команды LOCK_TABLE.




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Web - программирование / PHP /

GTK+: перспективы развития
02-03-2010   

Библиотека GTK+ прошла долгий путь развития и сейчас очень популярна. GNOME, одна из ведущих оконных сред, использует GTK+ почти исключительно, GIMP построен на GTK+, множество коммерческих разработчиков ПО, таких как Abobe, NVidia и VMware, решили использовать эту библиотеку в качестве графической основы для своих продуктов... подробнее

Кол. просмотров: общее - 4395 сегодня - 0

Новостной портал
13-11-2009   

Slashdot.org – популярный новостной портал с посещаемостью 50 млн. человек в месяц. Авторы проекта добились такого успеха, предоставляя пользователям свежие и интересные новости из мира IT... подробнее

Кол. просмотров: общее - 4290 сегодня - 1

Параллельное выполнение скриптов может нарушить целостность информации в файлах
13-11-2009   

Здесь рассматривается вопрос, что бывает, если запустить некий скрипт почти одновременно (что происходит, например, при большой нагруженности сервера) несколько раз, т.е. запустить несколько копий одного и того же скрипта. И к чему это может привести... подробнее

Кол. просмотров: общее - 4104 сегодня - 0

No spam.php
10-11-2009   

...и снова о спаме. Кто о нем только не писал, и все писали, что это плохо и ай-яй-яй. Я не буду оригинальничать, и тоже скажу – это плохо. Это ай-яй-яй. Как бороться со спамерами со своей стороны... подробнее

Кол. просмотров: общее - 4153 сегодня - 1

Начинаем работу с рисунками в php для Windows
10-11-2009   

Эта статья даст вам общее представление о том, как создавать, обрабатывать и выводить рисунки в PHP4 для Windows... подробнее

Кол. просмотров: общее - 4136 сегодня - 1



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects