متغیرهای محیطی (Enviroment Variables) متغیر هایی هستند که بسته به نرم افزار ها یا سروریس هایی که در سیستم عامل در حال اجرا هستند , تعریف میشوند . احتمالا در مورد ست کردن PATH در PHP یا Composer شنیدید یا حتی هنگام نصب کردن یه نرم افزار . در واقع PATH یک مثالی از متغیر های محیطی است.
بعضی از برنامه نویسان کد های خود را بر روی ماشین لوکال اجرا می کنند در حالی که بعضی دیگر ترجیح میدهند که آن را بر روی یک ماشین تست آنلاین با همان کانفیگ های سرور اصلی اجرا کنند . بعد از آن تست های خود را برای اطمینان از کارکرد نرم افزار بر روی محیط نهایی اجرا می کنند .
زمانی که اولین بار یاد گرفتم چطور ورژن کد های خود را با git کنترل کنم , به من گفته شد به هیچ وجه اطلاعات و داده های حساس را در سورس کد قرار ندم. اطلاعات حساس شامل پسورد دیتابیس , کلید های API , احراز هویت های وب سرویس و غیره .. است . خب حالا که یاد گرفتیم اطلاعات حساس را در داخل سورس کد قرار ندیم , چگونه می خواهیم در اپلیکیشن خود از کلید یا پسورد موردنظر استفاده کنید ؟ همانطور که حدس زدید استفاده از متغیرهای محیطی در php (Environment Variables) است .
ست کردن متغیرهای محیطی
تعریف کردن متغیرهای محیطی در سیستم عامل های مختلف , متفاوت می باشد . در این آموزش فقط قصد معرفی آن در زبان PHP را داریم .
برای ست کردن متغیرهای محیطی در PHP از دو روش می توانیم استفاده کنیم .
اولین روش استفاده از آرایه سوپرگلوبال $_ENV
است .
1 |
$_ENV['VARIABLE_NAME'] = 'super sentitive key'; |
یا یک روش پیشنهادی دیگر استفاده از تابع putenv در PHP است .
1 |
putenv('KEY=VALUE'); |
فراخوانی متغیرهای محیطی در PHP
همانند تعریف کردن متغییر محیطی در php , برای دریافت مقادیر متغیر های محیطی از دو روش استفاده میکنیم .
روش اول برای دسترسی به مقادیر متغیرهای محیطی استفاده از آرایه سوپرگلوبال $_ENV
و روش دیگر که باز پیشنهاد میشود از آن استفاده کنید تابع getenv
است که مقدار ذخیره شده را برگشت (return) میدهد.
1 |
echo $_ENV['PATH']; |
یا
1 |
echo getenv('PATH'); |
روش های بهتر برای مدیریت متغیرهای محیطی در PHP
روش های بالا به خوبی کار میکنند. بیشتر افراد فقط این تکه کد ها را در فایل اپلیکیشن php خود اضافه می کنند .در حالی که این مورد برخلاف عقیده ” به هیچ وجه اطلاعات و داده های حساس را در سورس کد قرار ندیم” است.
راه بهتری برای استفاده از متغییر های محیطی وجود دارد . می توانیم یک فایل PHP بسازیم و آن را جدا از سورس کد ورژن کنترل قرار بدیم و سپس متغییر های محیطی خود را در این فایل اضافه کنیم . بعد برای اطمینان از وجود فایل , از مدیریت خطاها (error exception) استفاده کنیم برای نمایش یک اخطار هنگام اجرا کد توسط توسعه دهنده ای که از کد ما استفاده می کند و اشاره کنیم که یک فایل بسازید .
این راهی بود که قبل از آشنایی با DotEnv استفاده می کردم . این کتابخانه راه تمیزتری برای استفاده به جای روش بالا می باشد
DotEnv چی چیزی پیشنهاد میدهد .
این کتابخانه به ما امکانات زیر را ارایه می دهد.
- می توانیم متغیرهای محیطی را بارگذاری کنیم.
- به ما اجازه تعریف متغیرهای محیطی که باید استفاده شود را می دهد.
- استفاده از تابع
env
را به صورت خلاصه شده زیر پیشنهاد میدهد
1 |
$option = getenv('VARIABLE') ? getenv('VARIABLE') : $default; |
- متغیرهای محیطی در php را اعتبارسنجی می کند
استفاده از کتابخانه DotEnv
این کتابخانه نیاز دارد که یک فایل .env بسازید که متغیرهای محیطی خود را به صورت جفت key=value قرار بدید
یک مثال از فایل .env
1 2 3 |
DB_NAME=databasename DB_PASSWORD=#sdf55a@$%df DB_HOST="localhost" |
مقدار key یک رشته (string) قبل از علامت = است و مقدار بعد از علامت مساوی (=) میتواند داخل یک کوتیشن (‘) باشد یا نه که همگی به سلیقه شخصی بستگی دارد.
قبل از استفاده از این کتابخانه در php باید این پکیج را از github دانلود یا از طریق composer نصب کنید . خب دستور نصب با کامپوزر به صورت زیر است
1 |
composer require --dev phpdotenv |
برای آشنایی با composer در php کلیک کنید
بعد از نصب کتابخانه dotEnv
و می توانیم فایل index.php خود را بسازیم و autoloader کامپوزر را فراخوانی کنیم
1 |
require __DIR__ . '/vendor/autoload.php'; |
بعد از فراخوانی (include) بسته نصب شده از شی DotEnv برای بارگذاری فایل .env استفاده می کنیم.
1 2 |
$dotenv = new Dotenv\Dotenv(__DIR__); $dotenv->load(); |
Constructor کلاس DotEnv دایرکتری فایل .env را دریافت می کند .
1 2 |
$dotenv = new Dotenv\Dotenv(__DIR__, 'new-config-file-name'); $dotenv->load(); |
دسترسی به اطلاعات DotEnv
همانطور که قبلا اشاره کردیم , می توانیم از تابع getenv برای دریافت مقدار متغیر محیطی استفاده کنیم ولی کتابخانه DotEnv تابع env که کوتاه تر از تابع getenv است ارایه میدهد . مهمتر از آن یک پارامتر دوم برای ست کردن مقدار پیش فرض در اختیار ما قرار می دهد.
1 2 |
// try and find the creator of PHP otherwise return HASAN Shafiei $option = env('PHP_CREATOR', 'hasan shafie'); |
مثالی از فایل wp-config.php وردپرس
استفاده از متغییرهای محیطی در PHP همان چیزی است که در فریمورک محبوب لاراول (Laravel) نیز مورد استفاده قرار میگیرد و به شخصه در پروژه های بدون لاراول با معماری mvc از این مورد بصورت همیشگی استفاده می کنم. پس توصیه می کنم برای ذخیره اطلاعات ثابت پروژه مثل اطلاعات ورود دیتابیس, فعال سازی حالت دیباگ و کلید API وبسرویس های جانبی و خیلی موارد دیگر از متغیرهای محیطی در php با استفاده از .env بهره ببرید.
جمع بندی
امیدوارم مقاله متغیرهای محیطی در PHP برای شما مفید واقع شده باشد و درک خوبی از اینکه چرا گاهی اوقات از متغیر های محیطی (Environment Variables) در اپلیکشن تحت وب خود استفاده کنیم , پیدا کنید.
هرگونه مشکلی در پیاده سازی کدها داشتید ، از قسمت نظرات اقدام کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق و پیروز باشید
سلام و ادب
میشه در مورد متغیرهای محیطی در هاست های اشتراکی نیز توضیح دهید. البته منظورم بیشتر در بحث امنیت آن است. یعنی چطور میتوان با توجه به امنیتی که اشاره کردید، در هاست اشتراکی استفاده نمود
به عنوان نمونه از طریق htaccess میتوان آنها را ست نمود.
ممنون از شما
بسم الله الرحمن الرحیم
سلام علیکم
عالی بود .
سلام. خوشحالیم که مفید واقع شده
موفق باشید
سلام
میشه توضیح بدید این متغیرهای محیطی عملکردشون چه شکلیه؟ چرا امن هستن برای ذخیره داده های حساس؟؟؟
سلام . شما چیزی مثل سیشن رو فرض کنید که یک سری داده ذخیره میکنه و فقط در سمت سرور در دسترسه (برخلاف کوکی). حالا در مورد متغیر های محیطی از نام آنها مشخص است . به اینصورت که در روت اصلی پروژه شما قرار نمیگیره و یک شاخه بالاتر است و عملا از طریق کاربر و محیط تعاملی سایت فایل دسترس نیست و بصورت محیطی (local) و داخل کدها از اون برای مدیریت ثابت ها استفاده میکنم.
موفق باشید.