Функция PHP closelog(): что это и как её использовать
Функция closelog() в PHP закрывает соединение с системным логгером (syslog), освобождая ресурсы после завершения записи журнала.
Функция closelog() закрывает соединение, которое PHP держит открытым с системным логгером (syslog). Соединение открывается с помощью openlog(), данные записываются через syslog(), а closelog() — это симметричный вызов, который его завершает. На этой странице описывается назначение функции, её сигнатура и возвращаемое значение, случаи, когда она действительно нужна, и её место в типичном процессе журналирования.
Синтаксис
closelog(): trueФункция не принимает никаких аргументов. Начиная с PHP 8.0 она всегда возвращает true; в PHP 7 и более ранних версиях объявленный тип возвращаемого значения был bool. Проверять результат почти никогда не нужно.
Что делает closelog()
closelog() закрывает дескриптор, который PHP открыл для системного логгера, и освобождает ресурсы, связанные с этим соединением. Несколько важных деталей:
- Вызов
closelog()является необязательным. PHP автоматически закрывает соединение с syslog по завершении скрипта, поэтому при обработке короткого веб-запроса явный вызов практически никогда не нужен. - Функция имеет смысл только при наличии открытого соединения. Вызов
closelog()при отсутствии активного соединения черезopenlog()/syslog()безвреден — он просто ничего не делает. - После
closelog()следующий вызовsyslog()автоматически переоткрывает соединение, при необходимости повторно читаяidentи параметры, переданные в свежий вызовopenlog().
Когда это действительно нужно
Поскольку PHP сам завершает все соединения по окончании запроса, случаи, когда вызов closelog() важен, связаны с долгоживущими или многоконтекстными скриптами:
- Долгоживущие CLI-воркеры и демоны. Процесс, работающий часами, должен освобождать файловые дескрипторы, которые больше не нужны, а не держать их открытыми.
- Смена идентификатора лога. Если нужно, чтобы последующие сообщения использовали другой
identили facility, вызовитеcloselog(), а затем сноваopenlog()с новыми настройками. - Чистота в общем коде. В библиотеке, открывающей собственное соединение с syslog, его закрытие позволяет избежать утечки этого соединения в код вызывающего.
Как использовать closelog()
Использование сводится к одному вызову без аргументов. Типичная схема: открыть → записать → закрыть:
<?php
// Open a connection, tagging each line with "myapp" and the process ID
openlog("myapp", LOG_PID | LOG_PERROR, LOG_LOCAL0);
// Write a message at the INFO priority level
syslog(LOG_INFO, "User login succeeded");
// Release the connection
closelog();LOG_PID добавляет идентификатор процесса к каждой записи, LOG_PERROR также выводит сообщение в стандартный поток ошибок, а LOG_LOCAL0 выбирает facility журналирования. Полный список параметров и facility смотрите в документации openlog().
Повторное использование соединения с новым идентификатором
closelog() — правильный способ сменить тег (ident) для последующих сообщений:
<?php
openlog("auth-service", LOG_PID, LOG_LOCAL0);
syslog(LOG_NOTICE, "Authentication attempt");
closelog();
// Later messages are tagged "billing-service" instead
openlog("billing-service", LOG_PID, LOG_LOCAL0);
syslog(LOG_NOTICE, "Invoice generated");
closelog();Распространённые ошибки
- Ожидание, что
closelog()сбросит буфер или «сохранит» логи. Каждый вызовsyslog()уже передаёт сообщение системному логгеру;closelog()только закрывает соединение. - Вызов после каждого отдельного сообщения. Многократное открытие и закрытие создаёт накладные расходы. В простом запросе достаточно один раз открыть соединение, записать нужное количество строк и закрыть в конце (или позволить PHP закрыть его самостоятельно).
- Предположение, что функция останавливает дальнейшее журналирование. Последующий вызов
syslog()прозрачно переоткрывает соединение —closelog()не блокирует журналирование.
Связанные функции
openlog()— открывает соединение с системным логгером.syslog()— генерирует системное сообщение журнала.
Заключение
closelog() закрывает соединение с syslog, открытое функцией openlog(), освобождая связанные с ним ресурсы. Функция не принимает аргументов и возвращает true. При обычных веб-запросах PHP закрывает соединение самостоятельно, поэтому прибегайте к closelog() главным образом в долгоживущих процессах или когда требуется сменить идентификатор журналирования в середине скрипта.