زمانی که تصمیم می گیریم برنامه ای را توسعه دهیم باید حواسمان به فاکتورهای مختلفی باشد تا محصول نهایی ما از کیفیت خوبی برخوردار شود. در واقع توسعه دهندگان با تجربه و خوب همیشه از بهترین روش ها و قراردادها برای کدنویسی استفاده می کنند؛ به طور مثال تست یا دیباگ برنامه، بررسی مسائل امنیتی، سرعت برنامه و... از وجوه اصلی هر برنامه ای هستند. ما می خواهیم در این سری مقاله در مورد نحوه انجام testing (تست برنامه) با روش های مختلف، مخصوصا Xdebug، صحبت کنیم.
در ساده ترین سطح اکثر ما زمانی که در حال کدنویسی php هستیم از توابعی مانند ()print_r
یا ()var_dump
استفاده می کنیم تا قسمت های کوچک کد را بررسی کنیم. تابعی مثل var_dump نه تنها نوع متغیر و خروجی را به شما نمایش می دهد بلکه در صورت برخورد با خطا و هشدارهای مختلف شما را از آن مطلع می سازد. شاید این روش برای تست کردن دو خط از کدهای برنامه روش بدی نباشد اما نمی توانیم از چنین روشی برای کل برنامه استفاده کنیم.
اگر به سطح بالاتری برویم می دانیم که در سرورهای هر شرکت ارائه خدمات میزبانی (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);
اخیرا صحبت هایی از توسعه 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 و مزایای آن آشنا شدیم و گفتیم که بدون آن باید برای هر خط از کدمان از توابعی مثل ()var_dump
استفاده کنیم تا بتوانیم مقدار متغیرها و روند اجرای برنامه را (آن هم در حدی محدود) درک کنیم. حالا زمان آن رسیده است که Xdebug را در ویرایشگر خود نصب کرده و از آن استفاده کنیم.
برای نصب Xdebug در ویندوز نیازی به انجام عملیات پیچیده نداریم. برای شروع ابتدا یک فایل php بسازید و کد زیر را در آن قرار دهید:
<?php phpinfo(); ?>
اگر این کد را توسط سرور مجازی خود (مثل WAMP یا XAMP یا هر سرور مجازی دیگری) اجرا کنید اطلاعات نسخه زبان php شما نمایش داده می شود. تمام اطلاعات نمایش داده شده را کپی کرده و درون Xdebug Wizard Tool قرار دهید. این wizard tool توسط تیم Xdebug طراحی شده است تا بر اساس اطلاعات php شما نسخه مناسب Xdebug را برای دانلود پیشنهاد بدهد. در آخر دکمه Analyze my phpinfo() output را کلیک کنید تا برنامه اطلاعات شما را بررسی کند:
بعد از بررسی اطلاعات شما، Xdebug نسخه مناسب شما را به شما پیشنهاد می دهد:
حالا این نسخه را که یک فایل dll. است دانلود کرده و بر اساس همان دستور العملی که در تصویر بالا مشاهده می کنید، عمل کنید:
xampp/php/ext
انتقال دهید (ما از XAMP استفاده کرده بودیم، نتایج برای شما متفاوت است).یک نمونه از کد اضافه شده به فایل 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;
همچنین اگر دوست دارید از 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 می باشد:
پس از نصب این افزونه VSCode را ری استارت کنید. حالا دوباره دستور ()phpinfo
را درون یکی از فایل های PHP خود اجرا کنید تا ببینید آیا Xdebug نصب شده است یا خیر. اگر نصب شده باشد آن را در اطلاعات نمایش داده شده مشاهده خواهید کرد.
حالا از منوی بالای صفحه روی سربرگ Debug کلیک کرده و گزینه Add configuration را انتخاب کنید:
سپس VSCode از شما می پرسد environment مد نظر شما چیست که باید PHP را انتخاب کنید:
با انتخاب PHP، ویرایشگر VSCode یک فایل launch.json ایجاد می کند:
درون این فایل باید حتما runtimeExecutable را مشخص کنید؛ برای این کار باید مسیر فایل php.exe خود را به آن بدهید. این مسیر برای من به شکل زیر است:
"runtimeExecutable": "C:\\xampp\\php\\php.exe"
تصویری از کد اضافه شده:
حالا این فایل را ذخیره کنید.
از این به بعد می توانید یک فایل php را باز کرده و از قسمت سمت چپ گزینه Launch currently open script را انتخاب کنید:
پس از انتخاب این گزینه، می توانید اسکریپت فعلی خود را دیباگ کنید. همانطور که در تصویر بالا مشخص است در بالای صفحه کنترل های روند اجرای برنامه را می بینید. این کنترل ها همان کنترل های حرکت breakpoint ها هستند. همچنین در قسمت پایین و سمت چپ برنامه قسمت BREAKPOINTS است که انواع خطاها را به شما نمایش می دهد. همچنین در قسمت Debug Console که در قسمت پایین تصویر مشخص است می توانید گزارش خطا را به تفصیل مطالعه کنید. این قسمت اطلاعات را به طور کامل و با جزئیات دقیق برایتان می نویسد.
حالا می توانیم breakpoint های خودمان را در برنامه ایجاد کنیم و با کنترل های debug خط به خط اجرای کدها را انجام دهیم:
کنترل های اجرای برنامه به شکل زیر هستند:
سوال: من با خطای PHP debugger not installed مواجه شده ام. چه کار کنم؟
پاسخ: ابتدا مسیر C:/php/ext
را چک کنید تا مطمئن شوید نام فایل ها را اشتباه وارد نکرده اید. اگر مشکل باز هم ادامه داشت، یک نسخه دیگر از Xdebug (مثل Xdebug 2.4.0rc1) را دانلود کنید (از این صفحه). سپس نام آن را به php_xdebug.dll تغییر دهید. این فایل را در مسیر php/ext قرار دهید و نهایتا وب سرور خود را ری استارت کنید.
به شما تبریک می گویم! از این به بعد می توانید به راحتی فایل های خود را debug کنید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.