![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Wowa |
|
|||
Эксперт ![]() Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
При работе CGI-скриптов, осуществляющих запись в файлы (а это большинство их видов - счетчики. гостевые книги, форумы и т.п.) возможна ситуация, когда два или более одновременно запущенных "экземпляра" скрипта попытаются одновременно записывать свои данные в файл.
Как минимум, это чревато потерей результатов работы одного из экземпляров скрипта, а как максимум - нарушением структуры файла данных и невозможностью нормальной работы скрипта до вмешательства админа. Поэтому в CGI-скриптах принимают специальные меры по блокировке одновременного использования файлов данных несколькими скриптами одновременно. В языке Perl, как и во многих языках программирования, есть специальная функция "блокировки" файла flock. Однако на практике эта функция не работает в портах Perl под Windows 9x. Соответственно, скрипты, использующие эту функцию, на мой взгляд, не могут считаться кросс-платформенными. Это также затрудняет отладку скриптов на машине под Windows перед перносом их на UNIX-хостинг. Тем не менее, защиту файлов от одновременного использования можно организовать и "своим путем", и это будет работать на всех системах. Предлагаемый здесь метод основан на использовании временного файла с заранее известным именем. Суть метода простая - перед тем, как "занять" файл данных, скрипт создает этот временный файл, а после освобождения - удаляет. Таким образом, наличие этого временного файла означает, что файл данных занят. Другой экземпляр скрипта перед записью проверяет наличие временного файла и, если он есть, дожидается его удаления первым экземпляром, и только затем начинает работу с файлом данных. Имя для временного файла может быть любым - главное, чтобы для блокировки разных файлов данных разными скриптами использовались разные имена. Фрагмент Perl-кода, реализующий такую защиту, может быть таким:
Этот участок скрипта проверяет, существует ли временный файл. Если он существует, то производится ($count) проверок его существования через интервалы ($interval) секунд (значения 50 и 0.05 можно заменить своими; предполагается, что время ($count*$interval) более чем достаточное, чтобы другой процесс завершил работу с файлом данных). Как только временный файл будет удален другим процессом, произойдет выход из цикла; далее скрипт создает свой временный файл, осущетсвляет работу с файлом данных и удаляет временный файл. Если скрипт работает на запись с несколькими файлами данных, то для защиты каждого должен быть, естественно, свой вышеописанный фрагмент кода (в нужном месте) и свое имя для временного файла. Во многих случаях имеет смысл "блокировать" файл данных не только во время записи в него, а во время всего цикла "чтение-модификация-запись". В противном случае очень возможна потеря результатов работы одного из "экземпляров" скрипта. На мой взгляд, этот подход не менее надежный, чем "стандартный Perl-овский", но зато нормально работающий и под Win9x, и под UNIX-подобными системами. При разработке своих CGI-скриптов я предпочитаю этот метод. В частности, в моем "Скрипте для ведения логов и учета посещений" описанным выше образом блокируется одновременное использование трех используемых скриптом файлов данных, и в процессе многолетнего использования мной этого CGI-скрипта никаких эксцессов, связанных конкретно с этим, не было. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |