Files

60 lines
1.5 KiB
PHP

<?php
declare(strict_types=1);
namespace MonetaPhpShop\callback;
use Throwable;
/**
* Æóðíàë îòêàçîâ äî ïðîâåðêè ïîäïèñè: àäðåñ êîëáýêà ïóáëè÷íûé, è çàïèñü íà êàæäûé ìóñîðíûé
* çàïðîñ ðàçäóâàëà áû æóðíàë îøèáîê PHP. Ïèøåò íå ÷àùå ñòðîêè çà èíòåðâàë è â íåé ñîîáùàåò,
* ñêîëüêî îòêàçîâ ïðîïóùåíî. Åñëè ñ÷¸ò÷èê íåäîñòóïåí (òàáëèöû íåò — ìîäóëü âûêëþ÷åí), ïèøåò âñ¸.
*/
final class ThrottledLogger implements Logger
{
public const INTERVAL = 60;
/** @var Logger */
private $logger;
/** @var LogThrottle */
private $throttle;
/** @var callable(): int */
private $clock;
/**
* @param callable(): int|null $clock unix-âðåìÿ; ïî óìîë÷àíèþ `time()`
*/
public function __construct(Logger $logger, LogThrottle $throttle, ?callable $clock = null)
{
$this->logger = $logger;
$this->throttle = $throttle;
$this->clock = $clock ?? 'time';
}
public function error(string $message): void
{
try {
$skipped = $this->throttle->pass(($this->clock)(), self::INTERVAL);
} catch (Throwable $exception) {
$this->logger->error($message);
return;
}
if ($skipped === null) {
return;
}
if ($skipped > 0) {
$message .= sprintf(
' Ïåðåä ýòèì íå çàïèñàíî îòêàçîâ: %d (íå ÷àùå ñòðîêè â %d ñ).',
$skipped,
self::INTERVAL,
);
}
$this->logger->error($message);
}
}