ویژگی تصویر

تابع checkdnsrr() در PHP

  /  PHP   /  تابع checkdnsrr() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع checkdnsrr() یکی از توابع ساده و پرکاربرد PHP برای بررسی وجود رکوردهای DNS مربوط به یک دامنه یا نام میزبان است. این تابع زمانی مفید است که بخواهید قبل از ارسال ایمیل یا اتصال به سرویسی از وجود رکوردهای DNS مانند MX یا A اطمینان حاصل کنید. در این مقاله به نحوۀ استفاده، نکات فنی، مثال‌های واقعی و توصیه‌های عملی می‌پردازیم.

نحوۀ استفاده و امضا (Syntax)

امضای تابع به شکل زیر است:

bool checkdnsrr ( string $host , string $type )

این تابع مقدار بولی برمی‌گرداند: true در صورتی که حداقل یک رکورد از نوع مشخص برای host وجود داشته باشد، و false در غیر این صورت.

پارامترها

  • $host: نام دامنه یا هاست (مثلاً “example.com” یا “mail.example.com”).
  • $type: نوع رکورد DNS که بررسی می‌شود (به‌صورت رشته). مثال: “A”, “MX”, “NS”, “TXT”, “AAAA” و غیره.

مقادیر رایج برای نوع رکورد

نوعمعنی
Aآدرس IPv4
AAAAآدرس IPv6
MXرکورد میل‌سرور (مهم برای ارسال ایمیل)
NSنام‌سرورهای دامنه
TXTرکوردهای متنی مثل SPF یا DKIM

مثال‌های کاربردی

مثال ساده برای بررسی وجود رکورد A:

<?php
$domain = 'example.com';
if (checkdnsrr($domain, 'A')) {
    echo 'A record exists';
} else {
    echo 'No A record';
}
?>

توضیح: این کد بررسی می‌کند که آیا برای example.com رکورد A وجود دارد یا خیر. در صورت وجود، پیام مربوطه چاپ می‌شود.

بررسی MX برای تأیید گیرنده ایمیل:

<?php
$domain = 'example.com';
if (checkdnsrr($domain, 'MX')) {
    echo 'Domain accepts mail (MX exists)';
} else {
    echo 'No MX records found';
}
?>

توضیح: قبل از ارسال ایمیل می‌توانید با این تابع از وجود رکورد MX مطمئن شوید. توجه داشته باشید که نبودن MX لزوماً به معنی تحریم کامل ایمیل نیست (در نبود MX ممکن است سرور به رکورد A بازگردد)، ولی بررسی MX مرسوم‌تر و دقیق‌تر است.

بهبودها و مقایسه با توابع دیگر

checkdnsrr() برای تشخیص سریع مناسب است، اما اگر نیاز به اطلاعات دقیق‌تر دارید از توابع زیر استفاده کنید:

  • getmxrr() — برای گرفتن لیست سرورهای MX و وزن آن‌ها.
  • dns_get_record() — برای دریافت تمام جزئیات رکوردها (آرایه‌ای از اطلاعات کامل).

مثال ترکیبی: گرفتن جزئیات MX با getmxrr:

<?php
$domain = 'example.com';
$mxhosts = [];
$weights = [];
if (getmxrr($domain, $mxhosts, $weights)) {
    print_r($mxhosts);
    print_r($weights);
} else {
    echo 'No MX records';
}
?>

توضیح: این کد لیستی از هاست‌های MX و وزن (priority) آن‌ها را برمی‌گرداند که می‌تواند برای انتخاب سرور ایمیل استفاده شود. getmxrr جزئیات بیشتری نسبت به checkdnsrr ارائه می‌کند.

نمونه پیشرفته: تابعی که دامنه را اعتبارسنجی و بررسی MX می‌کند

<?php
function domainHasMail($domain) {
    // اعتبارسنجی اولیه دامنه (PHP 7+)
    if (!filter_var($domain, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME)) {
        return false;
    }

    // پشتیبانی از دامنه‌های بین‌المللی (IDN)
    if (function_exists('idn_to_ascii')) {
        $domain = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46);
    }

    // ابتدا MX را چک کن
    if (checkdnsrr($domain, 'MX')) {
        return true;
    }

    // اگر MX نبود، بررسی کنیم آیا رکورد A یا AAAA وجود دارد (fallback)
    if (checkdnsrr($domain, 'A') || checkdnsrr($domain, 'AAAA')) {
        return true;
    }

    return false;
}
?>

توضیح: این تابع ابتدا دامنه را با FILTER_VALIDATE_DOMAIN بررسی می‌کند، سپس در صورت امکان با idn_to_ascii دامنه‌های بین‌المللی را تبدیل می‌کند، بعد MX را چک می‌کند و اگر MX وجود نداشت، رکوردهای A یا AAAA را به‌عنوان fallback بررسی می‌کند.

نکات فنی و محدودیت‌ها

  • checkdnsrr یک فراخوانی همگام (blocking) است و بسته به تنظیمات DNS/شبکه ممکن است با تأخیر اجرا شود.
  • این تابع تنها وجود رکورد را گزارش می‌دهد، نه اطلاعات کامل رکورد؛ برای جزئیات از dns_get_record یا getmxrr استفاده کنید.
  • نتایج تابع تحت تأثیر resolver سیستم و کش DNS قرار دارد؛ ممکن است رکورد تازه منتشر شده بلافاصله قابل مشاهده نباشد.
  • قبل از اجرای تابع توصیه می‌شود ورودی‌ها را اعتبارسنجی کنید تا از حملات تزریق یا مقادیر نامعتبر جلوگیری شود.
  • برخی انواع رکوردها ممکن است در نسخه‌های مختلف PHP یا پلتفرم‌های متفاوت به‌صورت کامل پشتیبانی نشوند؛ استفاده از dns_get_record در صورت نیاز به پورتابل بودن بهتر است.

نکاتی برای سئو و عملکرد در اپلیکیشن‌ها

اگر این چک را در صفحه‌هایی با ترافیک بالا انجام می‌دهید، بهتر است نتیجۀ آن را کش کنید (مثلاً به مدت 5–60 دقیقه بسته به TTL رکوردها) تا از بار روی DNS و تأخیرهای شبکه کم شود. همچنین، برای تصمیم‌گیری‌هایی مثل نمایش فرم ثبت‌نام یا ارسال ایمیل از یک منطق fall-back استفاده کنید تا کاربر با خطا مواجه نشود.

خلاصه و بهترین شیوه‌ها

  • برای بررسی سریع وجود رکورد از checkdnsrr استفاده کنید.
  • برای جزئیات یا گرفتن مقادیر رکوردها از getmxrr یا dns_get_record بهره ببرید.
  • ورودی‌ها را با FILTER_VALIDATE_DOMAIN اعتبارسنجی کنید و در صورت نیاز IDN را تبدیل کنید.
  • نتایج DNS را کش کنید و به محدودیت‌های شبکه توجه داشته باشید.

با رعایت این نکات می‌توانید از checkdnsrr به‌صورت مؤثر در فرآیندهای تأیید دامنه، ارسال ایمیل و بهبود پایداری سرویس‌های تحت وب استفاده کنید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: