Artykuły jmail's software

Otrzymywanie rekordów DNS w PHP na systemie Windows

by on sie.08, 2009, under PHP / CF / .NET / Java

Zdarza się, ze chcemy sprawdzić czy jakiś rekord DNS istnieje. Jak to zrobić przy użyciu PHP? W bardzo prosty sposób. Istnieje w końcu funkcja checkdnsrr w pakiecie PHP. Problem jest jednak taki, że na systemie Windows funkcja ta istnieje dopiero od wersji 5.3.0. I co w takim wypadku zrobić?

W takim wypadku należy siÄ™gnąć po funkcjÄ™, która rozwiąże nasz problem. Jest to funkcja znaleziona w komentarzach do manual’a na http://www.php.net i stamtÄ…d jest skopiowana

1
2
3
4
5
6
7
8
9
10
11
12
13
function win_checkdnsrr($host, $type='MX') {
    if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') { return; }
    if (empty($host)) { return; }
    $types=array('A', 'MX', 'NS', 'SOA', 'PTR', 'CNAME', 'AAAA', 'A6', 'SRV', 'NAPTR', 'TXT', 'ANY');
    if (!in_array($type,$types)) {
        user_error("checkdnsrr() Type '$type' not supported", E_USER_WARNING);
        return;
    }
    @exec('nslookup -type='.$type.' '.escapeshellcmd($host), $output);
    foreach($output as $line){
        if (preg_match('/^'.$host.'/',$line)) { return true; }
    }
}

 

Jak widzimy na powyższym przykÅ‚adzie, rozwiÄ…zanie to supportuje bardzo wiele typów zapytaÅ„ DNS. Najważniejsze co jest w tej funkcji wystÄ™puje w linii 9. Funkcja powyższa wykorzystuje wbudowane w Windows narzÄ™dzie “nslookup“, którego opis można znaleźć na stronie Microsoft © : http://support.microsoft.com/kb/200525 i nie bÄ™dÄ™ informacji stamtÄ…d powielaÅ‚. Jest tam dobrze wszystko opisane.

Dobrze skoro, już mamy funkcjÄ™, która potrafi nam badać DNS’y to jeszcze trzeba by zrobić tak, żeby po przeniesieniu na Linuxa system siÄ™ nie zawaliÅ‚….

Â

1
2
3
4
5
if (!function_exists('checkdnsrr')) {
    function checkdnsrr($host, $type='MX') {
        return win_checkdnsrr($host, $type);
    }
}

Jak widzimy, sprawdzamy czy istnieje funkcja checkdnsrr i jeżeli nie to ją definiujemy poprzez funkcję win_checkdnsrr. Dzięki temu uzyskaliśmy rozwiązanie ponad systemowe. Mało tego uzyskaliśmy rozwiązanie na serwery z różnymi wersjami PHP. Jeżeli będzie dostępna funkcja checkdnsrr to nic się nie stanie.

Nie jest to co prawda idealne rozwiÄ…zanie systemowe, bo wymaga obecnoÅ›ci “nslookup“, ale… Nslookup jest instalowane razem z pakietem TCP/IP, wiÄ™c jeżeli robisz to na localu to po prostu sprawdź czy zainstalowaÅ‚eÅ› pakiet.

I na koniec przykład zastosowania rozwiązania

1
2
3
4
5
6
7
echo "<pre>";
$domains=array('jmail.pl','battledust.pl', 'jmail2.pl');
foreach ($domains as $domain) {
    $result=checkdnsrr($domain);
    echo $domain.':';
    echo $result?"true\n":"false\n";
}
:, ,

Leave a Reply

Kalendarz

Sierpień 2009
P W Åš C P S N
« lip   wrz »
 12
3456789
10111213141516
17181920212223
24252627282930
31  
Linki sponsorowane:
ethica * katalog * rss * perfumy