W3docs

Функция 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() главным образом в долгоживущих процессах или когда требуется сменить идентификатор журналирования в середине скрипта.

Практика

Практика
Каково назначение функции closelog() в PHP?
Каково назначение функции closelog() в PHP?
Was this page helpful?