آشنایی با Xdebug و آموزش نصب و استفاده از آن

?How to Install and Use Xdebug

what-is-xdebug-01

آشنایی اولیه با Xdebug

زمانی که تصمیم می گیریم برنامه ای را توسعه دهیم باید حواسمان به فاکتورهای مختلفی باشد تا محصول نهایی ما از کیفیت خوبی برخوردار شود. در واقع توسعه دهندگان با تجربه و خوب همیشه از بهترین روش ها و قراردادها برای کدنویسی استفاده می کنند؛ به طور مثال تست یا دیباگ برنامه، بررسی مسائل امنیتی، سرعت برنامه و... از وجوه اصلی هر برنامه ای هستند. ما می خواهیم در این سری مقاله در مورد نحوه انجام testing (تست برنامه) با روش های مختلف، مخصوصا Xdebug، صحبت کنیم.

در ساده ترین سطح اکثر ما زمانی که در حال کدنویسی php هستیم از توابعی مانند ()print_r یا ()var_dump استفاده می کنیم تا قسمت های کوچک کد را بررسی کنیم. تابعی مثل var_dump نه تنها نوع متغیر و خروجی را به شما نمایش می دهد بلکه در صورت برخورد با خطا و هشدارهای مختلف شما را از آن مطلع می سازد. شاید این روش برای تست کردن دو خط از کدهای برنامه روش بدی نباشد اما نمی توانیم از چنین روشی برای کل برنامه استفاده کنیم.

سیستم Error Reporting زبان PHP

اگر به سطح بالاتری برویم می دانیم که در سرورهای هر شرکت ارائه خدمات میزبانی (hosting) قابلیت Error Reporting فعال است. این قابلیت یکی از ویژگی های زبان PHP است که هنگام مواجهه با خطا، نوع خطا و اطلاعاتی در مورد آن را به ما می دهد. هنگامی که در مرحله توسعه وب سایت یا برنامه خود هستیم باید همیشه Error reporting را فعال کنیم تا از ویژگی های بسیار عالی آن استفاده کرده باشیم و همچنین هنگامی که با خطا مواجه می شویم بدانیم مشکل از کجا است اما زمانی که وارد مرحله تولید (production - پس از توسعه، زمانی که وب سایت برای استفاده عموم روی سرور قرار می گیرد) می شویم باید Error Reporting را به طور کامل غیرفعال کنیم چرا که در صورت ایجاد خطا در برنامه، اطلاعات آن خطا برای همه کاربران نمایش داده می شود. برخی اوقات این خطاها و هشدارها دارای اطلاعات بسیار مهمی هستند که ممکن است مورد سوء استفاده هکرها و افراد خرابکار قرار بگیرند.

روش غیرفعال سازی یا فعال سازی Error Reporting نیز بسیار ساده است. شما باید به فایل php.ini مراجعه کنید:

error_reporting = E_ALL & ~E_NOTICE

error_reporting = E_ALL & ~E_NOTICE | E_STRICT

error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ER… _ERROR

error_reporting = E_ALL & ~E_NOTICE

گزینه E_All به معنای گزارش تمام خطاها می باشد. بنابراین اگر بخواهیم Error Reporting را در برنامه خود فعال کنیم بهتر است یک فایل پیکربندی (config) برای برنامه مان بسازیم و در آن بگوییم:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

همچنین می توانید از این روش برای فعال سازی Error Reporting برای برخی از فایل های خاص استفاده کنید. اگر با استفاده از دستور بالا خطایی را دریافت نکردید باید به فایل php.ini رفته و خط زیر را در آن فعال کنید:

display_errors = on

به طور جزئی تر می گویم:

- دستور زیر تمام خطاها را خاموش می کند:

error_reporting(0);

- این دستور فقط خطاهای ساده هنگام اجرای برنامه را نمایش می دهد:

error_reporting(E_ERROR | E_WARNING | E_PARSE);

-  دستور E_NOTICE مسائلی مثل متغیرهای تعریف نشده و تایپ اشتباه نام آنها را نیز گزارش می دهد:

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

- دستور زیر تمام خطاها به جز E_NOTICE ها را نمایش می دهد:

error_reporting(E_ALL & ~E_NOTICE);

- دستور زیر تمام خطاها را گزارش می دهد:

error_reporting(E_ALL);

- دستور زیر نیز تمام خطاها را گزارش می دهد اما می توانید از آن در فایل پیکربندی (config) استفاده کنید:

ini_set('error_reporting', E_ALL);

Xdebug چیست؟

اخیرا صحبت هایی از توسعه DDD به میان آمده است که مخفف Debug Driven Development است یعنی «توسعه دیباگ محور». در این روش توسعه ما همزمان با کدنویسی، کدهایمان را دیباگ می کنیم و برخلاف روش های معمول این فرآیند را به انتهای پروژه موکول نمی کنیم. صرف نظر از اینکه طرفدار این روش باشید یا نه، به هر حال باید کدهایتان را قبل از پیاده سازی روی سرور دیباگ کنید تا مطمئن شوید با هیچ خطایی طرف نیستیم. به همین دلیل در نهایت به ابزاری برای دیباگ نیاز دارید و ابزاری که می خواهیم به شما معرفی کنیم Xdebug است.

تصور کنید کدهای برنامه تان را نوشته اید و حالا می خواهید آن را کامپایل کنید اما خطایی رخ می دهد و کد شما متوقف می شود. در این نوع شرایط یکی از بدترین مشکلات این است که اصلا نمی دانیم چه خطایی اتفاق افتاده است و مشکل از کجاست. معمولا سیستم Error Reporting زبان PHP سیستم خوبی برای پیدا کردن مشکلات ساده است اما اگر خطاها در سطح منطق کد رخ بدهند شناسایی آن ها کار Error Reporting نیست. اینجاست که Xdebug وارد می شود! Xdebug یک extension برای زبان PHP است که شبیه یک تابع ()var_dump بسیار پیشرفته عمل می کند و با قابلیت های خوب خود مانند stack trace به توسعه دهندگان اجازه می دهد تا کدهای خود را به صورت شفاف و بدون خطا بنویسند. Xdebug به شما اجازه می دهد breakpoint ها یا نقاطی را در برنامه خود تعریف کنید و روند اجرای کد را در هر مرحله متوقف نمایید تا بالاخره مشخص شود مشکل اجرایی ما مربوط به کدام قسمت است.

اضافه کردن breakpoint ها در Xdebug هیچ محدودیتی ندارد و می توانید به تعداد دلخواه خود breakpoint های مختلف به آن اضافه کنید. این breakpoint ها چه در یک تابع قرار بگیرند و چه در کدهای عادی شما، اطلاعات بسیار کاملی را ارائه میدهند (به طور مثال در حلقه ها و در هر گردش مقدار متغیر یا iterator ما را به ما نشان می دهند تا ببینیم در کدام گردش برنامه دچار مشکل شده است).

حالا که با Xdebug آشنا شده ایم وقت آن رسیده است که به صورت عملی با آن کار کنیم.

آموزش نصب و استفاده از Xdebug

در مقاله قبل با Xdebug و مزایای آن آشنا شدیم و گفتیم که بدون آن باید برای هر خط از کدمان از توابعی مثل ()var_dump استفاده کنیم تا بتوانیم مقدار متغیرها و روند اجرای برنامه را (آن هم در حدی محدود) درک کنیم. حالا زمان آن رسیده است که Xdebug را در ویرایشگر خود نصب کرده و از آن استفاده کنیم.

نصب Xdebug در ویندوز، مک و لینوکس

برای نصب Xdebug در ویندوز نیازی به انجام عملیات پیچیده نداریم. برای شروع ابتدا یک فایل php بسازید و کد زیر را در آن قرار دهید:

<?php

phpinfo();

?>

اگر این کد را توسط سرور مجازی خود (مثل WAMP یا XAMP یا هر سرور مجازی دیگری) اجرا کنید اطلاعات نسخه زبان php شما نمایش داده می شود. تمام اطلاعات نمایش داده شده را کپی کرده و درون Xdebug Wizard Tool قرار دهید. این wizard tool توسط تیم Xdebug طراحی شده است تا بر اساس اطلاعات php شما نسخه مناسب Xdebug را برای دانلود پیشنهاد بدهد. در آخر دکمه Analyze my phpinfo() output را کلیک کنید تا برنامه اطلاعات شما را بررسی کند:

صفحه ی Xdebug Wizard Tool
صفحه Xdebug Wizard Tool

بعد از بررسی اطلاعات شما، Xdebug نسخه مناسب شما را به شما پیشنهاد می دهد:

پیشنهاد نسخه ی مناسب به همراه دستور العمل استفاده از آن توسط Xdebug
پیشنهاد نسخه مناسب به همراه دستور العمل استفاده از آن توسط Xdebug

حالا این نسخه را که یک فایل dll. است دانلود کرده و بر اساس همان دستور العملی که در تصویر بالا مشاهده می کنید، عمل کنید:

  • فایل dll را دانلود نمایید.
  • فایل دانلود شده را به آدرس xampp/php/ext انتقال دهید (ما از XAMP استفاده کرده بودیم، نتایج برای شما متفاوت است).
  • به فایل ini بروید و کد زیر را به آن اضافه کنید (کدی که برنامه به شما می دهد - مانند تصویر بالا).
  • وب سرور یا سرور مجازی خود را ری استارت کنید.

یک نمونه از کد اضافه شده به فایل php.ini:

zend_extension="php_xdebug-2.6.0-7.0-vc14.dll"
xdebug.remote_enable = 1
xdebug.remote_autostart=on

این کد به انتهای فایل php.ini اضافه می شود. به جای zend_extention باید نام فایل دانلود شده خودتان را قرار دهید. همچنین در برخی از موارد دیده شده است بدون دو دستور بعدی (xdebug.remote_enable و xdebug.remote_autostart) افزونه Xdebug اجرا نشده است بنابراین بهتر است این دو مورد را نیز به دستور قبل اضافه کنید.

کاربران سیستم های مک (شرکت اپل) می توانند از افزونه pecl برای نصب Xdebug استفاده کنند:

pecl install xdebug

کاربران لینوکس (مانند Debian) نیز می توانند از sudo برای نصب Xdebug استفاده کنند:

sudo apt install php-xdebug;

البته پس از آن باید به مسیر etc/php/7.0/mods-available/xdebug.ini بروند و کدهای زیر را به آن اضافه کنند تا Xdebug فعال شود:

xdebug.profiler_enable_trigger = 1

xdebug.profiler_enable = 0

xdebug.remote_enable = 1

xdebug.profiler_output_dir = "/tmp"

حالا باید سرور Apache2 را ریستارت کنید:

sudo service apache2 restart;

نصب Xdebug با استفاده از Git

همچنین اگر دوست دارید از Git برای نصب Xdebug استفاده کنید، می توانید کد زیر را اجرا کنید:

git clone git://github.com/xdebug/xdebug.git

سپس فایل php.ini را باز کرده و کد زیر را به آن اضافه کنید:

zend_extension="xdebug.so"

حالا اگر دستور php -v را اجرا کنید، علاوه بر نسخه php، نسخه Xdebug نصب شده نیز به شما نمایش داده می شود:

$ php -v

PHP 7.2.0RC6 (cli) (built: Nov 23 2017 10:30:56) ( NTS DEBUG )

Copyright (c) 1997-2017 The PHP Group

Zend Engine v3.2.0-dev, Copyright (c) 1998-2017 Zend Technologies

 with Xdebug v2.6.0-dev, Copyright (c) 2002-2017, by Derick Rethans

نصب Xdebug در ویرایشگر VSCode

اگر از IDE هایی مثل PHPStorm و zend studio یا ویرایشگرهایی مثل VSCode استفاده می کنید بهترین روش کار با Xdebug این است که آن را درون همین ویرایشگرها نصب نمایید. پس از نصب Xdebug در ویندوز به VSCode بروید و از قسمت افزونه ها عبارت php debug را جست و جو نمایید. این افزونه توسط آقای Felix Becker توسعه داده شده است و همان Xdebug می باشد:

افزونه ی php debug در VSCode
افزونه php debug در VSCode

پس از نصب این افزونه VSCode را ری استارت کنید. حالا دوباره دستور ()phpinfo را درون یکی از فایل های PHP خود اجرا کنید تا ببینید آیا Xdebug نصب شده است یا خیر. اگر نصب شده باشد آن را در اطلاعات نمایش داده شده مشاهده خواهید کرد.

حالا از منوی بالای صفحه روی سربرگ Debug کلیک کرده و گزینه Add configuration را انتخاب کنید:

انتخاب گزینه ی Add Configuration از منوی بالا
انتخاب گزینه Add Configuration از منوی بالا

سپس VSCode از شما می پرسد environment مد نظر شما چیست که باید PHP را انتخاب کنید:

انتخاب environment برای Debug کردن پروژه
انتخاب environment برای Debug کردن پروژه

با انتخاب PHP، ویرایشگر VSCode یک فایل launch.json ایجاد می کند:

نمایی از فایل launch.json اضافه شده
نمایی از فایل launch.json اضافه شده

درون این فایل باید حتما runtimeExecutable  را مشخص کنید؛ برای این کار باید مسیر فایل php.exe خود را به آن بدهید. این مسیر برای من به شکل زیر است:

"runtimeExecutable": "C:\\xampp\\php\\php.exe"

تصویری از کد اضافه شده:

اضافه کردن runtimeExecutable مرحله ای ضروری است.
اضافه کردن runtimeExecutable مرحله ای ضروری است.

حالا این فایل را ذخیره کنید.

از این به بعد می توانید یک فایل php را باز کرده و از قسمت سمت چپ گزینه Launch currently open script را انتخاب کنید:

انتخاب گزینه ی Launch currently open script برای شروع عملیات دیباگ
انتخاب گزینه Launch currently open script برای شروع عملیات دیباگ

پس از انتخاب این گزینه، می توانید اسکریپت فعلی خود را دیباگ کنید. همانطور که در تصویر بالا مشخص است در بالای صفحه کنترل های روند اجرای برنامه را می بینید. این کنترل ها همان کنترل های حرکت breakpoint ها هستند. همچنین در قسمت پایین و سمت چپ برنامه قسمت BREAKPOINTS است که انواع خطاها را به شما نمایش می دهد. همچنین در قسمت Debug Console که در قسمت پایین تصویر مشخص است می توانید گزارش خطا را به تفصیل مطالعه کنید. این قسمت اطلاعات را به طور کامل و با جزئیات دقیق برایتان می نویسد.

حالا می توانیم breakpoint های خودمان را در برنامه ایجاد کنیم و با کنترل های debug خط به خط اجرای کدها را انجام دهیم:

ایجاد breakpoint های دلخواه در کد (دایره های قرمز رنگ)
ایجاد breakpoint های دلخواه در کد (دایره های قرمز رنگ)

کنترل های اجرای برنامه به شکل زیر هستند:

انتخاب گزینه های کنترل breakpoint ها
انتخاب گزینه های کنترل breakpoint ها
  • کلید f5 به معنی ادامه اجرای برنامه است (رفتن به خط یا دستور بعد)
  • کلید f10 به معنی رد شدن از قسمت خاصی است (مثلا اگر می خواهید از یک حلقه عبور کنید)
  • کلید f11 به معنی وارد شدن به قسمت خاصی از کدها است.
  • کلید های shift + f11 به معنی خارج شدن از قسمت خاصی از کدها است.

سوال: من با خطای PHP debugger not installed مواجه شده ام. چه کار کنم؟

پاسخ: ابتدا مسیر C:/php/ext را چک کنید تا مطمئن شوید نام فایل ها را اشتباه وارد نکرده اید. اگر مشکل باز هم ادامه داشت، یک نسخه دیگر از Xdebug (مثل Xdebug 2.4.0rc1) را دانلود کنید (از این صفحه). سپس نام آن را به php_xdebug.dll تغییر دهید. این فایل را در مسیر php/ext قرار دهید و نهایتا وب سرور خود را ری استارت کنید.

به شما تبریک می گویم! از این به بعد می توانید به راحتی فایل های خود را debug کنید.


منابع: وب سایت های cloudways و codewall

نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.