From b6290fbe12b06010c2457f74cb23b4f27b5a3574 Mon Sep 17 00:00:00 2001 From: Rekryt Date: Sat, 31 Aug 2024 15:25:53 +0300 Subject: [PATCH] feat: delay for dns resolution --- .env.example | 3 ++- src/Domain/Helper/DNSHelper.php | 20 +++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.env.example b/.env.example index e658915..a38e72d 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,6 @@ COMPOSE_PROJECT_NAME="iplist" STORAGE_SAVE_INTERVAL="120" -SYS_MEMORY_LIMIT="512M" +SYS_DNS_RESOLVE_DELAY="1000" +SYS_MEMORY_LIMIT="1024M" SYS_TIMEZONE="Europe/Moscow" DEBUG="true" \ No newline at end of file diff --git a/src/Domain/Helper/DNSHelper.php b/src/Domain/Helper/DNSHelper.php index 960af3d..91f44cf 100644 --- a/src/Domain/Helper/DNSHelper.php +++ b/src/Domain/Helper/DNSHelper.php @@ -4,17 +4,23 @@ namespace OpenCCK\Domain\Helper; use Amp\Dns\DnsConfig; use Amp\Dns\DnsConfigLoader; -use Amp\Dns\DnsException; + use Amp\Dns\DnsRecord; use Amp\Dns\HostLoader; use Amp\Dns\Rfc1035StubDnsResolver; use OpenCCK\Infrastructure\API\App; +use Throwable; + +use function Amp\delay; use function Amp\Dns\dnsResolver; use function Amp\Dns\resolve; -readonly class DNSHelper { +class DNSHelper { + private float $resolveDelay; + public function __construct(private array $dnsServers = []) { + $this->resolveDelay = (\OpenCCK\getEnv('SYS_DNS_RESOLVE_DELAY') ?? 500) / 1000; } /** @@ -45,23 +51,27 @@ readonly class DNSHelper { $ipv4 = []; $ipv6 = []; foreach ($this->dnsServers as $server) { - $this->setResolver([$server]); try { + $this->setResolver([$server]); $ipv4 = array_merge( $ipv4, array_map(fn(DnsRecord $record) => $record->getValue(), resolve($domain, DnsRecord::A)) ); - } catch (DnsException $e) { + } catch (Throwable $e) { App::getLogger()->error($e->getMessage(), [$server]); } + delay($this->resolveDelay); + try { + $this->setResolver([$server]); $ipv6 = array_merge( $ipv6, array_map(fn(DnsRecord $record) => $record->getValue(), resolve($domain, DnsRecord::AAAA)) ); - } catch (DnsException $e) { + } catch (Throwable $e) { App::getLogger()->error($e->getMessage(), [$server]); } + delay($this->resolveDelay); } App::getLogger()->debug('resolve: ' . $domain, [count($ipv4), count($ipv6)]); return [$ipv4, $ipv6];