Подтвердить что ты не робот

Безопасна ли функция PHP error_log()?

Я хочу гарантировать, что при использовании пользовательского обработчика ошибок PHP не существует никаких условий гонки. С этой целью я хочу знать, могу ли я полагаться на error_log() или если мне нужно использовать какой-либо другой метод блокировки файлов для обеспечения правильной регистрации ошибок.

Как работает обработчик ошибок PHP по умолчанию? Безопасно ли оно от условий гонки?

Например, мне нужно заблокировать файл (который может привести к потере ошибок в этой простой версии)

function log_error($message)
{
    if(! $fp = @fopen('/path/to/error.log', 'a'))
    {
        return FALSE;
    }

    flock($fp, LOCK_EX);
    fwrite($fp, $message);
    flock($fp, LOCK_UN);
    fclose($fp);

    return TRUE;
}

или я могу просто вызвать error_log?

error_log($message, 0);
4b9b3361

Ответ 1

Вы можете найти источник для реализации error_log в ext/standard/basic_functions.c. Вы увидите, что он в значительной степени просто вызывает какой-либо определенный логгер. Если вас беспокоит какое-то перемещение данных по самому error_log из-за нескольких одновременных вызовов, не нужно. Или, по крайней мере, не более, чем большинство других фрагментов кода PHP. Если ваш пользовательский регистратор записывает в файл, вам необходимо реализовать блокировку файлов самостоятельно. Параллельные вызовы error_log (через процессы) - довольно распространенный сценарий.

изменить

Вам почти наверняка лучше использовать встроенный журнал, доступный через error_log.

Реализация PHP flock использует консультативную блокировку, которая позволяет другим процессам просто игнорировать блокировку и запись. Кроме того, в ваших собственных процессах вы окажетесь IO связанным, так как процесс ждет получения блокировки. Используя error_log, вы можете настроить регистрацию syslog. Syslog является асинхронным, поэтому вы избегаете фиксации блокировки и также поддерживаете (обычно) буфер ядра, который позволяет любому демонам syslog записывать последовательные записи без проблем.

Внедрение протоколов высокой пропускной способности в ряде компаний я бы настоятельно рекомендовал настроить либо syslog, либо перейти к чему-то вроде писца. Мой 2c.