60 lines
1.5 KiB
PHP
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);
|
|
}
|
|
}
|