Еще одна проблема состоит в обслуживании многочисленных серверов, для которых может быть предусмотрена запись информации журнала в один и тот же файл. Если они попытаются выполнить запись одновременно, сообщения в журнале могут перемешаться. Для предотвращения этого применяются рекомендательные блокировки файла, создаваемые с помощью встроенной функции flock ().
Функция flock () имеет простую синтаксическую структуру.
$boolean = flock (FILEHANDLE | $how) ;
Первым параметром этой функции является дескриптор файла, открытый в файл, который должен быть заблокирован, а вторым — числовая константа с обозначением операции блокировки, которая должна быть выполнена.
Параметры функции flock ()
LOCK_EX - Установить исключительную блокировку
LOCK_SH - Установить разделяемую блокировку
LOCK_UN - Разблокировать файл
Разделяемыми блокировками, создаваемыми с помощью операции LOCK_SH, могут владеть несколько процессов одновременно, и они применяются, когда информацию в файле читает сразу несколько программ. Здесь используется блокировка LOCK_EX, поскольку она может принадлежать одновременно только одному процессу и применима для блокировки файла, в который должна быть выполнена запись. Эти три константы могут быть импортированы из модуля Fcntl с использованием тега : flock.
Подпрограммы log_debug (), log_notice () и log_warn () будут откорректированы так, чтобы они позволяли записать в дескриптор файла правильно откорректированные сообщения. В качестве дополнительной возможности в этих функциях предусмотрена проверка внутренней переменной пакета $PRIORITY, позволяющая вписывать в журнал только те сообщения, приоритет которых равен значению этой переменной или превышает его. В результате появляется возможность вести подробный журнал во время разработки и отладки, а после ввода в эксплуатацию ограничиться регистрацией сообщений об ошибках.
Пример использования этой схемы приведен в листинге ниже. В нем пределен небольшой модуль LogFile.
После загрузки модуля LogFile вызывается подпрограмма init_lоg (), которая передается имя пути к применяемому файлу журнала.