Skip to content

Check propagation

Check propagation

The quick check

use Cbox\Dns\Dns;
use Cbox\Dns\Enums\RecordType;
use Cbox\Dns\Propagation\PropagationStatus;

$dns = new Dns;

$report = $dns->checkPropagation('www.example.com', RecordType::A, 'example.com');

match ($report->status) {
    PropagationStatus::Propagated   => 'Everyone agrees — the change is live.',
    PropagationStatus::Pending      => 'Correct at the source; some resolvers are still stale.',
    PropagationStatus::Misconfigured => 'The authoritative answer itself is missing.',
};

Show what's lagging

$report->authoritativeValues;   // the source-of-truth set

foreach ($report->stale() as $result) {
    printf("%s still serves %s\n", $result->nameserver, implode(', ', $result->values));
}

stale() returns the ResolverResults that don't yet agree with the authoritative set; each carries the nameserver, its returned values, the agrees flag, and an optional provider label.

Poll the full named registry

checkPropagation() polls a lean six-IP panel. For a labelled check across the full 15-provider registry, build the checker directly:

use Cbox\Dns\Propagation\PropagationChecker;

$report = (new PropagationChecker($dns->resolver(), $dns->authoritative()))
    ->checkAcrossProviders('www.example.com', RecordType::A, 'example.com');

foreach ($report->results as $result) {
    printf("%s (%s): %s\n", $result->label, $result->nameserver, $result->agrees ? 'ok' : 'stale');
}

Read this honestly

This is a cache-diversity signal across independent recursive operators, not global geographic propagation — every provider is anycast, so you sample operators, not locations. The reliable signal is the authoritative-vs-recursive diff. See Propagation and the provider registry.