При использовании Monolog с StreamHandler
это нормальная ситуация, когда несколько экземпляров скрипта PHP будут параллельно записывать в один и тот же файл журнала.
(например, в моем приложении Symfony, когда несколько пользователей открывают «страницу входа» одновременно, это приведет к запуску нескольких экземпляров сценария моего приложения (app.php
), и, таким образом, два экземпляра Monolog StreamHandler
будут записываться в один и тот же app/logs/prod.log
.)
Почему, несмотря на одновременную запись в файл, каждая строка журнала не разрывается посередине и не перепутывается? Почему ситуация ниже никогда не происходит:
- instance1 StreamHanler записал только половину строки журнала,
- instance2 StreamHanler записал первую половину
- экземпляр1 записал вторую половину строки журнала
- instance2 записал вторую половину строки журнала
- теперь наш лог-файл в беспорядке, потому что перепутаны две строки.
Я попытался просмотреть исходный код StreamHanler
https://github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/StreamHandler.php#L93
Но я не вижу никакого надлежащего контроля параллелизма, есть flock()
, но он, кажется, отключен (->useLocking=false
) в конфигурации по умолчанию (Symfony), и кажется, что журналы без него в порядке...
if ($this->useLocking) {
// ignoring errors here, there's not much we can do about them
flock($this->stream, LOCK_EX);
}
fwrite($this->stream, (string) $record['formatted']);
if ($this->useLocking) {
flock($this->stream, LOCK_UN);
}
Но почему журналы волшебным образом в порядке?