Otrzymywanie rekordów DNS w PHP na systemie Windows
by jmail 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"; } |