Skip to content

Commit e498252

Browse files
committed
[dns] Introduce CachedExecutor, does not expire records yet
1 parent ce2047c commit e498252

2 files changed

Lines changed: 74 additions & 0 deletions

File tree

Query/CachedExecutor.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace React\Dns\Query;
4+
5+
use React\Dns\Model\Message;
6+
7+
class CachedExecutor implements ExecutorInterface
8+
{
9+
private $executor;
10+
private $cache;
11+
12+
public function __construct(ExecutorInterface $executor, RecordCache $cache)
13+
{
14+
$this->executor = $executor;
15+
$this->cache = $cache;
16+
}
17+
18+
public function query($nameserver, Query $query, $callback)
19+
{
20+
$cachedRecord = $this->cache->lookup($query);
21+
if (null !== $cachedRecord) {
22+
$callback($cachedRecord);
23+
return;
24+
}
25+
26+
$cache = $this->cache;
27+
$this->executor->query($nameserver, $query, function ($response) use ($cache, $query, $callback) {
28+
$callback($response);
29+
$cache->storeResponseMessage($response);
30+
});
31+
}
32+
}

Query/RecordCache.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace React\Dns\Query;
4+
5+
use React\Dns\Model\Message;
6+
use React\Dns\Model\Record;
7+
8+
class RecordCache
9+
{
10+
private $records = array();
11+
12+
public function lookup(Query $query)
13+
{
14+
$id = $this->serializeQuery($query);
15+
$record = isset($this->records[$id]) ? $this->records[$id] : null;
16+
17+
return $record;
18+
}
19+
20+
public function storeResponseMessage(Message $message)
21+
{
22+
foreach ($message->answers as $record) {
23+
$this->storeRecord($record);
24+
}
25+
}
26+
27+
public function storeRecord(Record $record)
28+
{
29+
$id = $this->serializeRecord($record);
30+
$this->records[$id] = $record;
31+
}
32+
33+
public function serializeQuery(Query $query)
34+
{
35+
return sprintf('%s:%s:%s', $query->name, $query->type, $query->class);
36+
}
37+
38+
public function serializeRecord(Record $record)
39+
{
40+
return sprintf('%s:%s:%s', $record->name, $record->type, $record->class);
41+
}
42+
}

0 commit comments

Comments
 (0)