زمانی که تصمیم می گیریم برنامه ای را توسعه دهیم باید حواسمان به فاکتورهای مختلفی باشد تا محصول نهایی ما از کیفیت خوبی برخوردار شود. در واقع توسعه دهندگان با تجربه و خوب همیشه از بهترین روش ها و قراردادها برای کدنویسی استفاده می کنند؛ به طور مثال تست یا دیباگ برنامه، بررسی مسائل امنیتی، سرعت برنامه و... از وجوه اصلی هر برنامه ای هستند. ما می خواهیم در این سری مقاله در مورد نحوه ی انجام 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 آشنا شده ایم وقت آن رسیده است که به صورت عملی با آن کار کنیم. در قسمت بعد نحوه ی نصب و کار با آن را به شما آموزش می دهم.
دیدگاههای شما
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.