هندل کردن محیط‌های چندگانه

مجتبی پاکزاد کدایگنایتر 3.1.9 در حال تکمیل رایگان

دولوپرها اغلب رفتار سیستمی متفاوتی را بسته به اینکه یک اپلیکیشن در محیط دولوپمنت (توسعه) یا پروداکشن (محصول ساخته شده) قرار دارد خواستار هستند. برای مثال، خروجی وِربُس ارور (Verbose Error) چیزی است که در فاز توسعه یک اپلیکیشن بسیار مفید است، اما بعد از دِپلوی (Deploy) اپلیکیشن و اجرا روی محیط سایت ممکن است به یک مشکل امنیتی تبدیل شود.

اصطلاحات فنی

در دیکشنری‌های مختلف مانند کمبریج و آکسفورد در تعریف وِربُس آمده است: "استفاده یا شامل کلمات بیشتر از حد نیاز". همین تعریف به زیبایی مفهوم این نوع خطا را بیان می‌کند، یعنی این نوع خطا جزئیاتی بیش از حد نیاز (که در مرحله دپلوی نیاز به آن‌ نیست) را در اختیار دولوپر قرار می‌دهند.

Verbose Error خطاهایی هستند که با اکسپشن‌های هندل نشده و اِستک تریس اولین محل رخ دادن خطا را نشان می‌دهند، معمولا همراه با شماره خط و نام فایلی که خطا در آن رخ داده است همراه هستند. معمولا این نمایش خطاها همراه با دستورات چند خط قبل و بعد، محل رخدادن خطا هستند. ضمن اینکه معمولا تعداد این خطوط، در فریمورک‌های مختلف قابل تنظیم است. این اصطلاح معادل فارسی مناسبی ندارد و بهتر است به همین شکل تلفظ شود.

اِستک تریس (Stack Trace) چند مرحله از خطا را نشان می‌دهند، مثلا خطا در چه خطی از چه فایلی رخ داده که در اثر فراخوانی چه متدی در چه خطی بوده و غیره.

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

ثابت ENVIRONMENT

به صورت پیش‌فرض، کدایگنایتر مقدار ثابت مروبط به محیط کار اپلیکیشن (ENVIRONMENT) را با استفاده از آرایه $_SERVER['CI_ENV'] مقداردهی می‌کند، در صورتی که این متغییر دارای مقدار نباشد، مقدار پیش‌فرض development را به آن تخصیص می‌دهد. در بالای فایل index.php خط را خواهید دید:

define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');

این متغییر سرور را در فایل .htaccess یا کانفیگ آپاچی با استفاده از SetEnv می‌توانید مقداردهی کنید. روش جایگزینی برای nginx و سایر سرورها نیز وجود دارد، یا می‌توانید این لاجیک (منطق) را به صورت کامل حذف کنید و این ثابت را بر اساس آدرس IP سرور مقداردهی کنید.

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

تاثیر بر رفتار پیش‌فرض فریمورک

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

گزارش خط

اگر مقدار development به ثابت ENVIRONMENT نسبت داده شود، باعث می‌شود تمامی خطاهای PHP وقتی اتفاق می‌افتند برای رندر به مرورگر ارسال شوند. در مقابل، مقداردهی production به این ثابت،  خروجی تمام نوع‌های خطاها را غیرفعال می‌کند. غیرفعال‌سازی گزارش خطاها (error reporting) در فاز پروداکشن، یک راهکار امنیتی (best practice) خوب است.

اصطلاحات فنی

Best Practice یک یا چند تکنیک است که بهترین روش یافت شده توسط متخصص‌ها و درباره یک موضوع تاکنون است، مثلا در مثال بالا، غیرفعال‌سازی گزارش‌گیری خطاها و هندل کردن خطاها با اکسپشن‌ها بهترین راهکار و به اصطلاح best practice این زمینه است که هم موجب افزایش امنیت می‌شود و هم کاربرپسندتر است. این اصطلاح معادل فارسی مناسبی ندارد و بهتر است به همین شکل بست پرَکتیس تلفظ شود.

فایل‌های کانفیگ

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