Наверное, я что-то нашел (пробовал на windows, PHP 5.3.0, из CLI):
Когда я делаю это:
$tests = array('A', 'MX', 'NS', 'SOA', 'PTR', 'CNAME', 'AAAA', 'A6', 'SRV', 'NAPTR', 'TXT', 'ANY');
foreach ($tests as $type) {
echo " Type = $type : ";
var_dump(checkdnsrr("test.com", $type));
}
Я понял:
C:\bin\php-5.3\tests>c:\bin\php-5.3\php.exe test-dns.php
bool(true)
test.com dns check:
Type = A : bool(false)
Type = MX : bool(false)
Type = NS : bool(false)
Type = SOA : bool(false)
Type = PTR : bool(false)
Type = CNAME : bool(false)
Type = AAAA : bool(false)
Type = A6 : bool(false)
Type = SRV : bool(false)
Type = NAPTR : bool(false)
Type = TXT : bool(false)
Type = ANY : bool(false)
Итак, ни один из тестов не дает «истину»: - (
Но когда я пытаюсь с другим доменом:
$tests = array('A', 'MX', 'NS', 'SOA', 'PTR', 'CNAME', 'AAAA', 'A6', 'SRV', 'NAPTR', 'TXT', 'ANY');
foreach ($tests as $type) {
echo " Type = $type : ";
var_dump(checkdnsrr("pascal-martin.fr", $type));
}
(проверено на этом, потому что я знаю, что на нем, и хотел проверить на конкретную идею ^^)
Я получаю:
C:\bin\php-5.3\tests>c:\bin\php-5.3\php.exe test-dns.php
bool(true)
test.com dns check:
Type = A : bool(true)
Type = MX : bool(true)
Type = NS : bool(true)
Type = SOA : bool(true)
Type = PTR : bool(true)
Type = CNAME : bool(true)
Type = AAAA : bool(true)
Type = A6 : bool(true)
Type = SRV : bool(true)
Type = NAPTR : bool(true)
Type = TXT : bool(true)
Type = ANY : bool(true)
Итак, функция работает ... По крайней мере, для некоторых доменов!
Почему это может быть?
Может быть, на DNS-сервере test.com что-то не настроено? А что-то настроено на pascal-martin.fr?
Я недостаточно хорошо знаю системы DNS, чтобы сказать: - (
Вот пара выводов некоторых команд (из Linux):
$ dig pascal-martin.fr
; <<>> DiG 9.5.1-P2 <<>> pascal-martin.fr
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22164
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;pascal-martin.fr. IN A
;; ANSWER SECTION:
pascal-martin.fr. 86400 IN A 213.186.33.2
;; Query time: 29 msec
;; SERVER: 212.27.40.241#53(212.27.40.241)
;; WHEN: Fri Aug 7 00:00:47 2009
;; MSG SIZE rcvd: 50
и:
$ dig test.com
; <<>> DiG 9.5.1-P2 <<>> test.com
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62572
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;test.com. IN A
;; ANSWER SECTION:
test.com. 7200 IN A 204.12.0.50
;; Query time: 136 msec
;; SERVER: 212.27.40.241#53(212.27.40.241)
;; WHEN: Fri Aug 7 00:00:51 2009
;; MSG SIZE rcvd: 42
Кажется, почти то же самое ... так что не проблема здесь?
Давайте попробуем еще один:
$ host pascal-martin.fr
pascal-martin.fr has address 213.186.33.2
pascal-martin.fr mail is handled by 100 mxb.ovh.net.
pascal-martin.fr mail is handled by 1 mx0.ovh.net.
А:
$ host test.com
test.com has address 204.12.0.50
Ну, здесь есть разница! Может ли проблема быть вызвана тем, что test.com разрешает IP, но не имеет записи MX? Или как то так?
Может быть, это так: когда я использую dns_get_record
для проверки записей DNS MX, у меня нет результата для test.com:
array(0) {
}
Но у меня есть два для pascal-martin.fr:
array(2) {
[0]=>
array(6) {
["host"]=>
string(16) "pascal-martin.fr"
["type"]=>
string(2) "MX"
["pri"]=>
int(100)
["target"]=>
string(11) "mxb.ovh.net"
["class"]=>
string(2) "IN"
["ttl"]=>
int(14481)
}
[1]=>
array(6) {
["host"]=>
string(16) "pascal-martin.fr"
["type"]=>
string(2) "MX"
["pri"]=>
int(1)
["target"]=>
string(11) "mx0.ovh.net"
["class"]=>
string(2) "IN"
["ttl"]=>
int(14481)
}
}
Ну, я действительно не знаю, "почему" ... Но, по крайней мере, вот несколько указателей ...
Я не могу найти ничего другого в документации php; Итак, я не знаю, предполагаемое ли это поведение: - (
В любом случае: удачи!
РЕДАКТИРОВАТЬ: ну, может действительно быть какая-то проблема под Windows, потому что когда я пытаюсь с Linux, я получаю:
Для test.com:
$ php temp.php
Type = A : bool(true)
Type = MX : bool(false)
Type = NS : bool(true)
Type = SOA : bool(true)
Type = PTR : bool(false)
Type = CNAME : bool(false)
Type = AAAA : bool(false)
Type = A6 : bool(false)
Type = SRV : bool(false)
Type = NAPTR : bool(false)
Type = TXT : bool(false)
Type = ANY : bool(true)
А для pascal-martin.fr:
$ php temp.php
Type = A : bool(true)
Type = MX : bool(true)
Type = NS : bool(true)
Type = SOA : bool(true)
Type = PTR : bool(false)
Type = CNAME : bool(false)
Type = AAAA : bool(false)
Type = A6 : bool(false)
Type = SRV : bool(false)
Type = NAPTR : bool(false)
Type = TXT : bool(false)
Type = ANY : bool(true)
Значит, не одно и то же (всегда верно или всегда ложно) Я попал в Windows ...
Может быть там что-то вроде, на windows, функция всегда ищет запись MX, не учитывая второй параметр?
(Просто очень дикое предположение ^^)