Шаг 4 - Обработка данных шлюзом

Тут советов не много, а тем более наставлений, так как разработчик должен решать сам, что ему разместить внутри своей программы. Давайте поговорим о том как защитить, или лучше сказать, организовать эту работу.

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

Думаю способов сделать это можно найти достаточно много, и в каждой операционной системе обязательно найдутся необходимые процедуры. Например, в Юниксах можно заблокировать на запись или чтение определенный участок файла. Такие способы могут очень помочь, но они зачастую достаточно сложны и в повседневной жизни (вернее программировании :-) редко используются, поэтому у вас могут возникнуть определенные сложности на начальном этапе.

Есть способ, который просто реализовать и он не требует больших сил. Он заключается в следующем. Ваша программа при запуске создает временный файл, например с именем lock.$. Такой же скрипт при запуске проверяет наличие этого файла, и если он не находит его, то создает его и продолжает работу, если же он его находит, то ждет несколько секунд и снова проверяет его наличие. По окончании работы каждый скрипт обязан этот временный файл удалить. Т.е. получается программа будет ждать пока существует временный файл, созданный другой программой.

Пример реализации данного метода:

 FILE f_lock;

/* ..... */

 int counter;
 /* Проверяем наличие временного файла */
 while ((f_lock = fopen("lock.$", "r")) != NULL)
   {
      fclose(f_lock);
      counter++;
      if (counter>15000)
      {
       /*Сообщаем об ошибке и выходим */
       printf("Error !!! Can't delete lock.$ file.");
       return 1;
      };
   };

  /* Создаем временный файл */
   f_lock = fopen("lock.$", "w");
   fclose(f_lock);

  /*... Работа основной части скрипта ...*/

  /* Удаляем временный файл */
   while (remove("lock.$")!=0);

Как видно этот способ достаточно прост в реализации и точно убережет Вас от неправильной работы скрипта.

Думаю к минусам этого метода надо отнести то, что он не позволяет выполнять свою работу другим запущенным скриптам, из-за того что и им приходится ждать. Если у Вас происходят десятки обращений в минуту или даже секунду, то лучше конечно блокировать части файлов. Но это уже возможности самой системы, под которую расчитан скрипт (и не всегда это можно реализовать). А для обычных гостевых книг данный метод просто идеален.

Если уж мы как бы заговорили о быстродействии скриптов, то надо назвать один большой минус технологии CGI в целом. Заключается он в том, что при каждом обращении к скрипту веб-сервер запускает отдельную программу для обработки запроса, а это требует достаточно много ресурсов системы и процессорного времени. В случае действительно больших нагрузок Вам придется подумать о реализации таких скриптов в совершенно ином виде, но, вероятно, встраивания кода шлюза в код Веб-сервера вы не сможете избежать. Встроить код достаточно сложно, так как вы должны не только иметь код веб сервера (что иногда просто невозможно), но и знать как все это "чудо" работает. На такое, естественно, способны не многие :-(. Хотя, написать свой сервер бывает очень полезно, для того чтобы на своей "шкуре" прочувствовать всю силу и сложность современных технологий :-))).


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Кузин Андрей.