Step Debugging در وردپرس یعنی اجرای کد به‌صورت خط‌به‌خط و توقف در نقاط مشخص، به‌جای حدس‌زدن علت خطا از روی پیام‌های لاگ؛ همین تغییر نگرش، فاصله میان یک ساعت جستجو و چند دقیقه ریشه‌یابی را رقم می‌زند. توسعه‌دهندگان وردپرس معمولاً با ابزارهایی مانند error_log() و var_dump() کار می‌کنند که پاسخ‌های خام و پراکنده می‌دهند، اما یک دیباگر گام‌به‌گام مانند Xdebug در ترکیب با یک IDE حرفه‌ای، امکان مشاهده پشته فراخوانی، مقدار متغیرها و مسیر اجرای واقعی کد را فراهم می‌کند. این قابلیت در پروژه‌های پیچیده‌ای که هوک‌های تودرتو، کوئری‌های زنجیره‌ای و افزونه‌های متعدد درگیر هستند، تفاوت میان حدس و قطعیت است. راه‌اندازی درست Step Debugging نیازمند پیکربندی Xdebug، تنظیم IDE، مدیریت پورت شبکه و درک مفاهیمی مانند Breakpoint، Step Over، Step Into و Watch است. مسلط شدن به این جریان کاری، سرعت توسعه و کیفیت کد را در پروژه‌های وردپرسی به‌شکل محسوسی بالا می‌برد.

در یک پروژه ووکامرس که سفارش‌ها به‌طور تصادفی با خطای محاسبه مالیات ثبت می‌شدند، سه روز صرف بررسی لاگ‌ها شد. نقطه پایان آن ماجرا لحظه‌ای بود که Xdebug فعال شد و با یک Breakpoint شرطی در فیلتر woocommerce_calculated_total مشخص شد یک افزونه دیگر مقدار کل را قبل از محاسبه مالیات تغییر می‌دهد. از آن تجربه، الگوی کار تغییر کرد: پیش از هر بررسی لاگ، نخست دیباگر گام‌به‌گام راه‌اندازی می‌شود.

Step Debugging چیست و چه تفاوتی با لاگ‌نویسی دارد؟

Step Debugging یک روش تشخیصی است که در آن اجرای برنامه در نقاط مشخصی متوقف می‌شود و توسعه‌دهنده می‌تواند حالت برنامه را در آن لحظه مشاهده کند. برخلاف لاگ‌نویسی که نیازمند اضافه کردن دستی دستورهای چاپ در کد است، دیباگر گام‌به‌گام بدون تغییر کد اصلی کار می‌کند و امکان بررسی پویا را فراهم می‌آورد.

در روش لاگ‌محور، توسعه‌دهنده باید پیش‌بینی کند کدام متغیر در کدام مرحله مهم است، سپس دستور چاپ اضافه کند، صفحه را بارگذاری کند، لاگ را بررسی کند و این چرخه را چندین بار تکرار کند. در Step Debugging، این چرخه به یک بار متوقف شدن در نقطه موردنظر و مشاهده همه متغیرها به‌طور همزمان کاهش می‌یابد.

مقایسه‌ای ساختاری میان این دو روش:

ویژگی لاگ‌نویسی Step Debugging
تغییر کد نیازمند افزودن دستور چاپ بدون تغییر کد
مشاهده متغیرها فقط متغیرهای انتخاب‌شده همه متغیرها در دامنه جاری
پشته فراخوانی غیرقابل مشاهده قابل مشاهده کامل
کنترل جریان اجرا ندارد توقف، پرش، ورود به تابع
هزینه راه‌اندازی پایین متوسط تا بالا
مناسب برای محیط تولید بله، با احتیاط خیر

این جدول نشان می‌دهد که Step Debugging به‌طور مشخص برای محیط توسعه طراحی شده است و نباید روی سایت زنده فعال بماند. با این حال، در محیط توسعه، توانایی‌های آن از لاگ‌نویسی فراتر می‌رود.

اگر در حال آشنایی با مفاهیم پایه خطایابی در وردپرس هستید، مرور نوشتار چرا وردپرس خطا نشان می‌دهد و رفع با Debug می‌تواند نقطه شروع مناسبی باشد.

دیباگر گام‌به‌گام جای لاگ‌نویسی را نمی‌گیرد؛ آن را از یک حدس‌زدن پرهزینه به یک مشاهده دقیق تبدیل می‌کند.

چرا توسعه‌دهنده وردپرس به دیباگر گام‌به‌گام نیاز دارد؟

معماری وردپرس بر پایه هوک‌ها بنا شده است. یک صفحه معمولی می‌تواند از ده‌ها اکشن و فیلتر عبور کند که هرکدام از افزونه‌های متفاوتی می‌آیند. در این وضعیت، ردیابی مسیر اجرا با ابزارهای سنتی تقریباً غیرممکن می‌شود.

۱. لایه‌های تودرتوی هوک

فرض کنید فیلتر the_content توسط سه افزونه تغییر داده می‌شود. ترتیب اجرای این فیلترها بر اساس اولویت (Priority) تعیین می‌شود. اگر خروجی نهایی نامطلوب باشد، تشخیص اینکه کدام فیلتر مسئول است، بدون دیباگر بسیار دشوار است. مرور ساختار هوک‌ها در نوشتار نحوه استفاده صحیح از هوک‌های وردپرس دید جامع‌تری می‌دهد.

۲. کد افزونه‌های شخص ثالث

در بسیاری از موارد، خطا از افزونه‌ای ناشی می‌شود که کد آن به‌طور کامل شناخته‌شده نیست. دیباگر اجازه می‌دهد بدون خواندن تمام کد افزونه، در نقاط کلیدی مانند توابع تغییردهنده داده متوقف شد و مقدار ورودی و خروجی را مشاهده کرد.

۳. کوئری‌های زنجیره‌ای

در ووکامرس و افزونه‌های پیچیده، یک درخواست می‌تواند ده‌ها کوئری دیتابیس را فعال کند. دیباگر اجازه می‌دهد در حین اجرا، مقدار متغیرهایی که به کوئری پاس داده می‌شوند بررسی شود و منبع داده نامعتبر شناسایی گردد.

۴. خطاهای شرطی

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

تجربه‌های عملی در خطایابی وردپرس نشان می‌دهد که افزونه‌های قدیمی یا کدهای سفارشی رهاشده، بیشترین سهم را در خطاهای دشوار دارند. مرور این الگوها در نوشتار خطاهای رایج وردپرس و رفع مرحله‌به‌مرحله آنها مفید است.

راه‌اندازی Xdebug: از نصب تا پیکربندی

Xdebug محبوب‌ترین افزونه دیباگ برای PHP است و در وردپرس نیز استاندارد عملی محسوب می‌شود. راه‌اندازی آن چند مرحله مشخص دارد.

گام نخست: نصب Xdebug

در محیط‌های لوکال مانند Local، MAMP و XAMPP، Xdebug معمولاً از پیش نصب شده است. در محیط‌های لینوکسی، نصب با مدیر بسته انجام می‌شود:

sudo apt install php-xdebug

پس از نصب، باید مطمئن شوید نسخه Xdebug با نسخه PHP همخوان است. ناهماهنگی نسخه، شایع‌ترین دلیل بارگذاری نشدن افزونه است.

گام دوم: پیکربندی php.ini

[xdebug]
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=127.0.0.1
xdebug.client_port=9003
xdebug.idekey=VSCODE
xdebug.log=/tmp/xdebug.log
xdebug.log_level=7

نکات مهم در این پیکربندی:

  • xdebug.mode=debug حالت دیباگ را فعال می‌کند. حالت develop برای نمایش بهتر خطاها و حالت profile برای پروفایلینگ استفاده می‌شود.
  • xdebug.start_with_request=yes باعث می‌شود هر درخواست به‌طور خودکار دیباگ شود. در محیط توسعه مناسب است، اما روی سرور مشترک باید روی trigger تنظیم شود.
  • xdebug.client_port=9003 پورت پیش‌فرض نسخه‌های جدید Xdebug است. در نسخه‌های قدیمی‌تر این مقدار ۹۰۰۰ بود.
  • xdebug.log_level=7 سطح لاگ کامل را فعال می‌کند و در عیب‌یابی اتصال مفید است.

گام سوم: بررسی نصب

با دستور زیر می‌توان تأیید کرد که Xdebug به‌درستی بارگذاری شده است:

php -v
php -m | grep xdebug

اگر در خروجی php -v عبارت with Xdebug دیده نشود، پیکربندی php.ini به‌درستی اعمال نشده است.

گام چهارم: فعال‌سازی Debug در وردپرس

برای مشاهده خطاهای PHP به‌صورت ساختاریافته، فایل wp-config.php را ویرایش کنید:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
define('SCRIPT_DEBUG', true);

راهنمای کامل این پیکربندی در نوشتار فعال‌سازی حالت Debug وردپرس و پیدا کردن خطاها آمده است.

Xdebug تنها زمانی معجزه می‌کند که پیکربندی php.ini و IDE هر دو درست باشند؛ نیمی از مشکلات راه‌اندازی، ریشه در ناهماهنگی همین دو لایه دارد.

پیکربندی IDE: VS Code و PhpStorm

پس از راه‌اندازی Xdebug، باید IDE با آن ارتباط برقرار کند. دو محیط توسعه محبوب در اکوسیستم وردپرس، VS Code و PhpStorm هستند.

پیکربندی VS Code

افزونه رسمی PHP Debug افزونه اصلی است که توسط خود تیم VS Code نگهداری می‌شود. پس از نصب، فایل .vscode/launch.json را در ریشه پروژه بسازید:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for Xdebug",
      "type": "php",
      "request": "launch",
      "port": 9003,
      "pathMappings": {
        "/var/www/html": "${workspaceFolder}"
      }
    }
  ]
}

بخش pathMappings در محیط‌های Docker و سرورهای مجازی حیاتی است، چون مسیر فایل‌ها در سرور با مسیر فایل‌های محلی متفاوت است.

پیکربندی PhpStorm

در PhpStorm، از مسیر Settings → PHP → Debug پورت ۹۰۰۳ و Debug Port تنظیم می‌شود. سپس در بخش Servers، سرور محلی تعریف و مسیرهای آن به مسیرهای پروژه نقشه‌برداری می‌شوند.

برای شروع جلسه دیباگ، دکمه «Start Listening for PHP Debug Connections» در نوار ابزار فعال می‌شود و سپس صفحه وردپرس در مرورگر بارگذاری می‌گردد.

افزونه‌های کمکی مرورگر

افزونه‌هایی مانند Xdebug Helper برای کروم و فایرفاکس به شما امکان می‌دهند دیباگ را فقط برای درخواست‌های خاصی فعال کنید. این ابزار در سایت‌هایی با ترافیک بالای درخواست‌های داخلی مفید است. فهرست ابزارهای ضروری مرورگر در نوشتار افزونه‌های ضروری مرورگر برای توسعه‌دهندگان آمده است.

مفاهیم کلیدی: Breakpoint، Step Over، Step Into، Watch

زبان مشترک دیباگرها شامل چند مفهوم پایه است که تسلط بر آن‌ها، کیفیت کار را تعیین می‌کند.

Breakpoint

نقطه توقف، محلی در کد است که اجرا در آن متوقف می‌شود. با کلیک روی شماره سطر در IDE، Breakpoint تنظیم می‌شود. هنگام اجرا، به‌محض رسیدن به این سطر، جریان در آن متوقف و IDE حالت کامل برنامه را نشان می‌دهد.

Step Over

اجرای سطر جاری و توقف در سطر بعدی در همان دامنه. اگر سطر جاری فراخوانی یک تابع باشد، آن تابع به‌طور کامل اجرا می‌شود و وارد جزئیات آن نمی‌شویم.

Step Into

ورود به داخل تابع فراخوانی‌شده در سطر جاری. این گزینه زمانی استفاده می‌شود که می‌خواهید جزئیات اجرای تابع را بررسی کنید.

Step Out

اجرای کامل تابع جاری و بازگشت به تابع فراخوان‌کننده. زمانی مفید است که وارد تابعی شده‌اید که مطمئن شده‌اید خطا در آن نیست.

Continue

ادامه اجرا تا Breakpoint بعدی یا پایان اسکریپت.

Watch

افزودن یک متغیر یا عبارت به فهرست Watch، امکان پیگیری مقدار آن را در طول اجرا فراهم می‌کند. این قابلیت در حلقه‌ها و توابع بازگشتی بسیار مفید است.

Call Stack

پشته فراخوانی، مسیری که اجرا از نقطه شروع تا توقف فعلی طی کرده را نشان می‌دهد. در وردپرس، این پشته می‌تواند شامل توابع هسته، توابع قالب و توابع افزونه باشد و به سرعت مشخص می‌کند کدام مسیر مسئول رسیدن به نقطه فعلی است.

مرور دقیق مسیر اجرای کد در قالب‌های وردپرس، در نوشتار چگونه خطای قالب را در وردپرس دیباگ کنیم؟ با مثال‌های عملی ارائه شده است.

دیباگ هوک‌ها و فیلترها

هوک‌ها قلب معماری وردپرس هستند و دیباگ آن‌ها یک مهارت کلیدی محسوب می‌شود.

توقف در فیلتر خاص

فرض کنید خروجی فیلتر the_content نامطلوب است. با افزودن یک تابع دیباگ به فیلتر در قالب فرزند یا افزونه اختصاصی، می‌توان در نقطه دقیق اجرا متوقف شد:

add_filter('the_content', function ($content) {
    $content = 'breakpoint-here'; // Breakpoint روی این سطر
    return $content;
}, 999);

اولویت ۹۹۹ تضمین می‌کند این فیلتر پس از تمام فیلترهای دیگر اجرا شود و بتوان خروجی نهایی را بررسی کرد.

بررسی ترتیب اجرای هوک‌ها

می‌توان در نقطه‌ای از کد، فهرست همه توابع متصل به یک هوک را بررسی کرد:

global $wp_filter;
var_dump($wp_filter['the_content']);

این رویکرد نشان می‌دهد چه توابعی به این هوک متصل‌اند و با چه اولویتی اجرا می‌شوند. با تنظیم Breakpoint در نقاط کلیدی، می‌توان ترتیب واقعی اجرا را دید. مرور جزئیات دیباگ اکشن و فیلتر در نوشتار دیباگ کردن Action و Filter در وردپرس توصیه می‌شود.

ردیابی فیلترهای خاص در افزونه‌های شخص ثالث

یکی از کاربردهای قدرتمند Step Debugging، ردیابی این است که کدام افزونه مسئول تغییر یک مقدار خاص است. با تنظیم Breakpoint در تابعی که خروجی فیلتر را می‌سازد و مشاهده Call Stack، نام افزونه و مسیر فایل مشخص می‌شود.

دیباگ درخواست‌های AJAX و REST API

دیباگ درخواست‌های غیرهمزمان، چالشی متفاوت دارد، چون مرورگر پاسخ را در پس‌زمینه دریافت می‌کند و IDE باید آماده دریافت اتصال باشد.

دیباگ admin-ajax.php

درخواست‌های AJAX وردپرس معمولاً به admin-ajax.php ارسال می‌شوند. برای دیباگ:

  1. IDE را در حالت Listening قرار دهید.
  2. در کد، در تابع پاسخ‌دهنده به اکشن، Breakpoint تنظیم کنید.
  3. عملیات مربوطه را در مرورگر اجرا کنید.

اگر درخواست AJAX از طریق fetch یا XMLHttpRequest ارسال شود و Xdebug در حالت start_with_request=yes باشد، به‌طور خودکار متصل می‌شود.

دیباگ REST API

REST API وردپرس از مسیر /wp-json/ استفاده می‌کند. برای دیباگ یک endpoint خاص، می‌توان در تابع callback آن Breakpoint تنظیم کرد و سپس با ابزاری مانند Postman یا مرورگر، درخواست را ارسال نمود. تحلیل دقیق ساختار REST API در نوشتار REST API در وردپرس راهنمای کامل آمده است.

استفاده از trigger

در محیط‌هایی که فقط می‌خواهید دیباگ روی یک درخواست خاص فعال شود، می‌توان start_with_request=trigger تنظیم کرد و سپس با ارسال پارامتر XDEBUG_SESSION=IDEKEY، دیباگ را فعال کرد:

https://example.local/?XDEBUG_SESSION=VSCODE

این الگو در سایت‌هایی که ترافیک داخلی بالایی دارند، کارایی را به‌شکل چشمگیری بهبود می‌دهد.

دیباگ در بستر ووکامرس

ووکامرس به‌دلیل پیچیدگی منطق تجاری، یکی از پرکاربردترین بسترها برای Step Debugging است.

دیباگ فرآیند تسویه حساب

فرآیند Checkout ووکامرس شامل چند مرحله AJAX، بررسی موجودی، محاسبه مالیات و ارسال به درگاه پرداخت است. با تنظیم Breakpoint در هوک woocommerce_checkout_process، می‌توان وضعیت سبد خرید را در لحظه پردازش مشاهده کرد:

add_action('woocommerce_checkout_process', function () {
    $cart = WC()->cart->get_cart(); // Breakpoint روی این سطر
    // بررسی محتوای سبد
});

دیباگ محاسبه مالیات و ارسال

فیلتر woocommerce_calculated_total و woocommerce_package_rates دو نقطه کلیدی در محاسبه مالیات و هزینه ارسال هستند. توقف در این فیلترها نشان می‌دهد چه مقادیری وارد و چه مقادیری خارج می‌شوند.

دیباگ سفارش‌های ناموفق

اگر سفارشی در مرحله نهایی ثبت نمی‌شود، Breakpoint در هوک woocommerce_checkout_order_processed یا woocommerce_new_order مسیر دقیق شکست را مشخص می‌کند. برای پیگیری خطاهای ارسال ایمیل سفارش، مطالعه نوشتار چرا ایمیل سفارش WooCommerce ارسال نمی‌شود؟ مفید است.

Breakpoint شرطی و تکنیک‌های پیشرفته

در پروژه‌های بزرگ، اجرای کد در حلقه‌ای با هزار تکرار یا در تابعی که در هر درخواست چندین بار اجرا می‌شود، توقف در هر بار عملاً بی‌فایده است. Breakpoint شرطی راه‌حل این مسئله است.

تعریف شرط

در VS Code و PhpStorm، با راست‌کلیک روی Breakpoint و انتخاب «Edit Breakpoint»، می‌توان یک شرط PHP تعریف کرد:

$order_id === 12345
$user_id > 1000
isset($cart['items']) && count($cart['items']) > 5

اجرا فقط زمانی متوقف می‌شود که شرط برقرار باشد. این تکنیک، زمان دیباگ در سناریوهای خاص را از ساعت به دقیقه کاهش می‌دهد.

Logpoint

در برخی IDE‌ها، می‌توان به‌جای توقف، یک پیام در لاگ ثبت کرد. Logpoint ترکیبی از Breakpoint و error_log() است بدون آنکه اجرا متوقف شود.

Exception Breakpoint

بسیاری از IDE‌ها امکان توقف خودکار در لحظه پرتاب هر Exception را فراهم می‌کنند. این قابلیت به‌ویژه در خطاهای نادر که منشأ آن‌ها نامشخص است، بسیار مفید است. با فعال‌سازی Exception Breakpoint، می‌توان نقطه دقیق وقوع خطا را مشاهده کرد و پشته فراخوانی کامل را بررسی نمود.

پروفایلینگ عملکرد در کنار دیباگ

Xdebug علاوه بر دیباگ، قابلیت پروفایلینگ نیز دارد. این قابلیت نشان می‌دهد هر تابع چه مدت زمان اجرا کرده و چند بار فراخوانی شده است.

فعال‌سازی پروفایلر

xdebug.mode=profile
xdebug.output_dir=/tmp/xdebug
xdebug.profiler_output_name=cachegrind.out.%p

پس از اجرا، فایل خروجی در مسیر تعیین‌شده ذخیره می‌شود و می‌توان آن را با ابزارهایی مانند KCachegrind یا QCachegrind بررسی کرد.

کاربرد در بهینه‌سازی

در سایت‌هایی که کندی عملکرد دارند، پروفایلر نشان می‌دهد کدام تابع بیشترین زمان را مصرف می‌کند. برخلاف Step Debugging که خطاهای منطقی را هدف می‌گیرد، پروفایلینگ گلوگاه‌های عملکردی را آشکار می‌کند. رویکرد لایه‌ای بهینه‌سازی در نوشتار چگونه مشکل سرعت سایت را عیب‌یابی کنیم؟ ارائه شده است.

دیباگ از راه دور روی سرور

در پروژه‌هایی که کد فقط روی سرور آزمایشی اجرا می‌شود، باید Xdebug از راه دور به IDE محلی متصل شود.

پیکربندی سمت سرور

xdebug.mode=debug
xdebug.start_with_request=trigger
xdebug.client_host=your-local-ip
xdebug.client_port=9003

مقدار client_host باید آدرس IP عمومی یا VPN شما باشد، نه 127.0.0.1 که به خود سرور اشاره می‌کند. پورت ۹۰۰۳ باید در فایروال سرور باز باشد.

پیکربندی سمت IDE

در VS Code، بخش pathMappings باید مسیر سرور را به مسیر پروژه محلی نگاشت کند. بدون این نقشه‌برداری، IDE نمی‌تواند فایل‌ها را تطبیق دهد و Breakpoint کار نمی‌کند.

ملاحظات امنیتی

دیباگ از راه دور پورت را باز می‌کند و باید فقط در محیط‌های آزمایشی با IP محدود فعال شود. فراموش کردن خاموش کردن Xdebug روی سرور تولید، یک آسیب‌پذیری جدی محسوب می‌شود. اصول امنیت سرور در نوشتار امنیت سرور (Server Security) دقیقاً بر چه اصولی استوار است؟ تشریح شده است.

اشتباهات رایج در Step Debugging

حتی توسعه‌دهندگان باتجربه نیز می‌توانند در دام‌هایی بیفتند که زمان دیباگ را چند برابر می‌کند:

  • فراموش کردن خاموش کردن Xdebug روی سرور تولید: این اقدام می‌تواند کارایی سایت را تا چند برابر کاهش دهد و یک در پشتی امنیتی باز کند.
  • اتصال برقرار نشدن به‌دلیل پورت اشتباه: نسخه‌های مختلف Xdebug پورت‌های پیش‌فرض متفاوتی دارند.
  • عدم تطابق pathMappings: در محیط‌های Docker و سرور مجازی، نبود این نگاشت مانع از فعال شدن Breakpoint می‌شود.
  • اجرای چند Breakpoint به‌طور همزمان: برای ریشه‌یابی یک مسئله، توقف‌های اضافی را غیرفعال کنید تا تمرکز حفظ شود.
  • نادیده گرفتن Call Stack: بسیاری از توسعه‌دهندگان فقط مقدار متغیر را می‌بینند و پشته فراخوانی را نادیده می‌گیرند که خود منبع اطلاعات ارزشمندی است.
  • نبود تنظیمات دقیق لاگ: بدون xdebug.log، ریشه‌یابی مشکلات اتصال دشوار می‌شود.

در کنار این دام‌ها، رعایت استانداردهای کدنویسی وردپرس نیز به کیفیت دیباگ کمک می‌کند، چون کد ساختاریافته‌تر، مسیر اجرا را شفاف‌تر می‌سازد. راهنمای این استانداردها در نوشتار استانداردهای کدنویسی وردپرس چیست آمده است.

پرسش‌های پرتکرار درباره Step Debugging در وردپرس

آیا Step Debugging روی سرور تولید قابل استفاده است؟

خیر. Xdebug در حالت debug سربار قابل توجهی روی عملکرد PHP اعمال می‌کند و همچنین پورت شبکه‌ای باز می‌کند که می‌تواند خطر امنیتی ایجاد کند. Step Debugging باید فقط در محیط توسعه یا سرور آزمایشی محدود اجرا شود.

تفاوت Xdebug و لاگ‌نویسی معمول چیست؟

لاگ‌نویسی نیازمند افزودن دستورهای چاپ در کد و بارگذاری مجدد صفحه است. Xdebug در حالت دیباگ، امکان توقف در نقطه دلخواه و مشاهده همه متغیرها و پشته فراخوانی را بدون تغییر کد فراهم می‌کند.

چرا VS Code به Xdebug متصل نمی‌شود؟

شایع‌ترین دلایل شامل پورت اشتباه در launch.json، نبود pathMappings در محیط Docker، تنظیم نبودن client_host و فعال نبودن حالت Listening در IDE است. بررسی xdebug.log نخستین گام عیب‌یابی است.

آیا Step Debugging در قالب‌های فرزند هم کار می‌کند؟

بله. در صورتی که pathMappings به‌درستی تنظیم شده باشد، Breakpoint در فایل‌های قالب فرزند نیز به‌خوبی عمل می‌کند.

چگونه درخواست‌های AJAX وردپرس را دیباگ کنیم؟

با تنظیم Xdebug در حالت start_with_request=trigger و افزودن پارامتر XDEBUG_SESSION به درخواست AJAX، یا با فعال کردن حالت yes در محیط توسعه. در هر دو حالت، IDE باید در حالت Listening باشد.

آیا Xdebug روی سرعت سایت توسعه تأثیر دارد؟

بله. حتی در حالت دیباگ غیرفعال، Xdebug می‌تواند ۱۰ تا ۳۰ درصد سربار داشته باشد. اگر در حین کار با IDE به دیباگ نیاز ندارید، می‌توانید حالت را به off تغییر دهید و پس از نیاز مجدداً فعال کنید.

آیا امکان دیباگ کد PHP داخل پوسته وردپرس وجود دارد؟

بله، اما پیکربندی متفاوتی می‌خواهد. باید xdebug.start_with_request=yes فعال باشد و متغیر محیطی XDEBUG_SESSION تنظیم گردد. سپس با اجرای WP-CLI و درخواست دیباگ، اتصال برقرار می‌شود.

تفاوت Step Into و Step Over چیست؟

Step Into وارد تابع فراخوانی‌شده می‌شود و اجرا را در سطر اول آن متوقف می‌کند. Step Over تابع را به‌طور کامل اجرا و در سطر بعدی همان دامنه متوقف می‌شود. از Step Into زمانی استفاده کنید که می‌خواهید جزئیات تابع را بررسی کنید.

چگونه در ووکامرس، فیلترهای مؤثر بر قیمت را دیباگ کنیم؟

با تنظیم Breakpoint در فیلترهای woocommerce_product_get_price، woocommerce_calculated_total و woocommerce_package_rates، می‌توان مقدار ورودی و خروجی هر فیلتر را مشاهده کرد و افزونه مسئول تغییر را شناسایی نمود.

آیا Xdebug با PHP نسخه ۸ و بالاتر سازگار است؟

بله، نسخه‌های جدید Xdebug با PHP 8.x سازگارند. برای PHP 8.0 و 8.1، Xdebug 3.1 و 3.2 توصیه می‌شود. برای PHP 8.2 و بالاتر، نسخه 3.2 به بالا مورد نیاز است.

زیر پوست دیباگر: نگاه سطح پلتفرم

در سطح مهندسی پلتفرم، Xdebug یک گسترش (Extension) در لایه Zend Engine است که به‌جای اجرای مستقیم بایت‌کد، در نقاط مشخصی از چرخه اجرا دخالت می‌کند. این دخالت از طریق هوک‌های داخلی موتور PHP انجام می‌شود که عبارت‌اند از zend_execute_ex برای فراخوانی توابع و zend_execute_internal برای توابع داخلی. درک این مکانیزم نشان می‌دهد چرا Xdebug سربار دارد: هر فراخوانی تابع، از یک لایه اضافی عبور می‌کند که برای تشخیص Breakpoint و ثبت وضعیت، پردازش بیشتری انجام می‌دهد.

پروتکل ارتباطی میان Xdebug و IDE، بر پایه یک پروتکل متنی ساده به نام DBGp (Debug Protocol) است که روی TCP اجرا می‌شود. این پروتکل، دستورهای مشخصی برای تعیین Breakpoint، درخواست مقدار متغیر، اجرای گام و دریافت پشته فراخوانی دارد. هر IDE که از این پروتکل پشتیبانی کند، می‌تواند با Xdebug کار کند؛ این توضیح می‌دهد چرا PhpStorm، VS Code و ابزارهای دیگر همه با یک Xdebug کار می‌کنند.

در سطح عملکرد، انتخاب حالت xdebug.mode اثر مستقیم دارد. حالت debug تنها زمانی سربار می‌سازد که دیباگ فعال است. حالت develop همیشه سربار کم دارد و برای نمایش بهتر خطاها استفاده می‌شود. حالت profile سربار قابل توجهی دارد و باید فقط در زمان نیاز فعال شود. بهترین رویکرد در محیط توسعه، تنظیم حالت روی debug و فعال‌سازی دیباگ به‌صورت درخواست‌محور با start_with_request=trigger است.

در سطح معماری، دیباگ در محیط‌های توزیع‌شده نیازمند نگاشت مسیر دقیق است. در محیط‌های Docker که مسیر فایل‌ها بین کانتینر و میزبان تفاوت دارد، ابزارهایی مانند Docker Compose با تعریف Volume به‌شکل مشترک، این پیچیدگی را کاهش می‌دهند. برای محیط‌های Kubernetes، تنظیم Port Forwarding یا استفاده از ابزارهایی مانند Telepresence می‌تواند اتصال را برقرار کند.

در سطح امنیت، باید توجه داشت که Xdebug در حالت دیباگ پورت TCP را باز می‌کند و به هر درخواست ورودی از هر IPی که به آن متصل شود پاسخ می‌دهد. این یعنی اگر روی سرور اینترنتی فعال باشد، مهاجم می‌تواند با اتصال به این پورت، جریان اجرای کد را کنترل کند. استفاده از xdebug.discover_client_host=false و محدود کردن IP مجاز از طریق فایروال، گام‌های ضروری در هر محیطی است که روی شبکه عمومی قرار دارد.

در سطح بهره‌وری، یک الگوی پیشرفته ترکیب Step Debugging با پروفایلینگ است. ابتدا با پروفایلر گلوگاه‌های عملکردی مشخص می‌شود، سپس با Step Debugging در همان نقاط توقف ایجاد می‌گردد تا منطق پشت گلوگاه بررسی شود. این دو ابزار مکمل یکدیگرند، نه جانشین. بدون پروفایلر، دیباگ ممکن است روی بخش‌هایی از کد تمرکز کند که سهم کمی در مسئله دارند.

در سطح پایش، توصیه می‌شود تنظیمات Xdebug در قالب فایل php.ini مخصوص محیط توسعه نگهداری شود و در کنترل نسخه پروژه قرار گیرد. این کار مانع از آن می‌شود که تنظیمات دیباگ به‌طور تصادفی به محیط تولید منتقل شوند. ابزارهایی مانند Docker و Vagrant امکان تعریف جداگانه پیکربندی برای هر محیط را فراهم می‌کنند.

در نهایت، ارزش واقعی Step Debugging در کاهش چرخه بازخورد است. هر بار که توسعه‌دهنده به‌جای افزودن دستور چاپ و بارگذاری مجدد صفحه، می‌تواند در نقطه دقیق توقف کند و همه متغیرها را یک‌جا ببیند، ساعت‌ها زمان آزاد می‌شود. این بهبود در پروژه‌های وردپرسی که پیچیدگی هوک و افزونه دارند، تفاوت محسوسی در سرعت تحویل ایجاد می‌کند.

پایان‌بندی

Step Debugging در وردپرس یک مهارت پایه است، نه یک ابزار لوکس. راه‌اندازی Xdebug و پیکربندی درست IDE، تفاوت میان توسعه‌دهنده‌ای که با حدس و آزمون‌وخطا پیش می‌رود و توسعه‌دهنده‌ای که با قطعیت و مشاهده دقیق کار می‌کند، رقم می‌زند. هوک‌ها، افزونه‌های شخص ثالث، AJAX، REST API و ووکامرس، همه بسترهایی هستند که در آن‌ها Step Debugging به صرفه‌جویی چشمگیر زمان منتهی می‌شود. تسلط بر مفاهیمی مانند Breakpoint شرطی، Watch، Call Stack و پروفایلینگ، کیفیت کار را از یک توسعه‌دهنده متوسط به یک مهندس حرفه‌ای ارتقا می‌دهد.

اگر این مسیر را در یک پروژه واقعی طی کرده‌اید، برای ادامه گفتگو مفید است بدانم کدام بخش بیشترین چالش را برایتان داشته است: راه‌اندازی Xdebug در محیط Docker، تنظیم Breakpoint شرطی در فیلترهای تودرتو، یا دیباگ از راه دور روی سرور آزمایشی. تجربه خود را در دیدگاه‌ها بنویسید؛ به‌ویژه اگر راه‌حل متفاوتی برای همان مشکل پیدا کرده‌اید که می‌تواند برای خواننده بعدی ارزشمند باشد.