การใช้ .env: จัดการ Environment Variables
ในบทความก่อนหน้านี้ เราได้เรียนรู้เกี่ยวกับการ Refactoring ด้วยเทคนิค Decompose Conditional ซึ่งช่วยให้โค้ดของเราอ่านง่ายและบำรุงรักษาง่ายขึ้น ในบทความนี้ เราจะมาเรียนรู้วิธีการจัดการ Environment Variables โดยใช้ไฟล์ .env ซึ่งเป็นวิธีที่ได้รับความนิยมในการกำหนดค่าต่างๆ ที่แตกต่างกันในแต่ละสภาพแวดล้อม (เช่น development, staging, production) การใช้ .env จะช่วยให้เราไม่ต้องแก้ไขโค้ดโดยตรงเมื่อต้องการเปลี่ยนค่าคอนฟิกูเรชัน และยังช่วยเพิ่มความปลอดภัยให้กับข้อมูลสำคัญ เช่น รหัสผ่านฐานข้อมูล หรือ API Keys
.env file คืออะไร
.env (อ่านว่า "ดอท อีเอ็นวี") คือไฟล์ข้อความธรรมดา (plain text file) ที่ใช้เก็บ Environment Variables หรือตัวแปรสภาพแวดล้อม โดย Environment Variables คือตัวแปรที่ใช้เก็บค่าคอนฟิกูเรชันต่างๆ ของแอปพลิเคชัน เช่น ข้อมูลการเชื่อมต่อฐานข้อมูล, API Keys, หรือ URL ของบริการภายนอก การใช้ .env ช่วยให้เราสามารถแยกค่าคอนฟิกูเรชันออกจากโค้ด ทำให้โค้ดของเรามีความยืดหยุ่นและง่ายต่อการจัดการมากยิ่งขึ้น
ข้อดีของการใช้ .env:
- ความปลอดภัย: ช่วยเก็บข้อมูลสำคัญ เช่น รหัสผ่านฐานข้อมูล, API Keys ให้เป็นความลับ ไม่ต้อง hardcode ในโค้ด
- ความยืดหยุ่น: ง่ายต่อการเปลี่ยนแปลงค่าคอนฟิกูเรชันในแต่ละสภาพแวดล้อม (development, staging, production)
- การจัดการ: ช่วยให้การจัดการค่าคอนฟิกูเรชันเป็นระบบมากขึ้น
การติดตั้ง Package สำหรับอ่าน .env
โดยปกติแล้ว PHP ไม่สามารถอ่านไฟล์ .env ได้โดยตรง เราจึงต้องใช้ Package ภายนอกเพื่อช่วยในการอ่านและจัดการ Environment Variables มีหลาย Package ที่สามารถใช้ได้ แต่ในบทความนี้เราจะใช้ Package ที่ชื่อว่า vlucas/phpdotenv ซึ่งเป็นที่นิยมและใช้งานง่าย
ขั้นตอนการติดตั้ง vlucas/phpdotenv:
- ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Composer แล้ว หากยังไม่ได้ติดตั้ง สามารถดาวน์โหลดและติดตั้งได้จาก https://getcomposer.org/
- เปิด Command Line หรือ Terminal ใน Directory ของโปรเจกต์ PHP ของคุณ
- รันคำสั่งต่อไปนี้เพื่อติดตั้ง
vlucas/phpdotenv: - Composer จะดาวน์โหลดและติดตั้ง Package พร้อมทั้ง Dependencies ที่เกี่ยวข้องลงในโปรเจกต์ของคุณ
composer require vlucas/phpdotenv
การสร้างไฟล์ .env
หลังจากติดตั้ง Package เรียบร้อยแล้ว ให้สร้างไฟล์ .env ใน Root Directory ของโปรเจกต์ของคุณ (Directory เดียวกับไฟล์ composer.json) จากนั้นให้เพิ่ม Environment Variables ที่คุณต้องการลงในไฟล์ .env โดยแต่ละตัวแปรจะอยู่ในรูปแบบ KEY=VALUE
ตัวอย่างไฟล์ .env:
APP_NAME=My Awesome App
APP_ENV=development
APP_DEBUG=true
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=my_database
DB_USERNAME=root
DB_PASSWORD=secret
ข้อควรระวัง:
- อย่า Commit ไฟล์
.envขึ้น Repository (เช่น GitHub) เนื่องจากไฟล์นี้อาจมีข้อมูลสำคัญที่เป็นความลับ - เพิ่มไฟล์
.envลงในไฟล์.gitignoreเพื่อป้องกันไม่ให้ Git ติดตามไฟล์นี้
การเข้าถึง Environment Variables
หลังจากที่เราสร้างไฟล์ .env และติดตั้ง Package vlucas/phpdotenv แล้ว เราสามารถเข้าถึง Environment Variables ในโค้ด PHP ของเราได้ง่ายๆ
ขั้นตอนการเข้าถึง Environment Variables:
- Include Autoloader ของ Composer ในไฟล์ PHP ของคุณ:
- Load Environment Variables จากไฟล์
.env: - เข้าถึง Environment Variables โดยใช้ฟังก์ชัน
getenv()หรือ$_ENV:
require __DIR__ . '/vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
$appName = getenv('APP_NAME'); // หรือ $_ENV['APP_NAME']
$dbHost = getenv('DB_HOST'); // หรือ $_ENV['DB_HOST']
ตัวอย่างการใช้งาน:
<?php
require __DIR__ . '/vendor/autoload.php';
use Dotenv\Dotenv;
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();
$appName = getenv('APP_NAME');
$dbHost = getenv('DB_HOST');
$dbPort = getenv('DB_PORT');
$dbDatabase = getenv('DB_DATABASE');
$dbUsername = getenv('DB_USERNAME');
$dbPassword = getenv('DB_PASSWORD');
echo "Application Name: " . $appName . "<br>";
echo "Database Host: " . $dbHost . "<br>";
echo "Database Port: " . $dbPort . "<br>";
echo "Database Name: " . $dbDatabase . "<br>";
echo "Database Username: " . $dbUsername . "<br>";
echo "Database Password: " . $dbPassword . "<br>";
?>
อธิบายโค้ด:
require __DIR__ . '/vendor/autoload.php';: Include Autoloader ของ Composer เพื่อให้สามารถใช้งาน Class ต่างๆ ที่ติดตั้งผ่าน Composer ได้$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);: สร้าง Instance ของ ClassDotenvโดยระบุ Directory ที่ไฟล์.envอยู่ (ในที่นี้คือ Root Directory ของโปรเจกต์)$dotenv->load();: Load Environment Variables จากไฟล์.envเข้าสู่ Environment ของ PHPgetenv('APP_NAME');: ดึงค่าของ Environment Variable ที่ชื่อAPP_NAMEโดยใช้ฟังก์ชันgetenv()
กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย
กรณีใช้งานจริง: การกำหนดค่า Database ในแต่ละ Environment
สมมติว่าเรามีแอปพลิเคชันที่ต้องเชื่อมต่อกับฐานข้อมูลที่แตกต่างกันในแต่ละ Environment (development, staging, production) เราสามารถใช้ .env เพื่อกำหนดค่าการเชื่อมต่อฐานข้อมูลสำหรับแต่ละ Environment ได้
ไฟล์ .env (development):
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=development_db
DB_USERNAME=root
DB_PASSWORD=
ไฟล์ .env (production):
DB_CONNECTION=mysql
DB_HOST=production_db_server
DB_PORT=3306
DB_DATABASE=production_db
DB_USERNAME=admin
DB_PASSWORD=super_secret_password
โค้ด PHP:
<?php
require __DIR__ . '/vendor/autoload.php';
use Dotenv\Dotenv;
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();
$dbConnection = getenv('DB_CONNECTION');
$dbHost = getenv('DB_HOST');
$dbPort = getenv('DB_PORT');
$dbDatabase = getenv('DB_DATABASE');
$dbUsername = getenv('DB_USERNAME');
$dbPassword = getenv('DB_PASSWORD');
// Use these variables to connect to the database
?>
ข้อผิดพลาดที่พบบ่อย:
- ลืมติดตั้ง
vlucas/phpdotenv: หากคุณพยายามใช้งานDotenvโดยที่ยังไม่ได้ติดตั้ง Package คุณจะได้รับ Error - ไฟล์
.envไม่ได้อยู่ใน Root Directory:Dotenvจะค้นหาไฟล์.envใน Root Directory ของโปรเจกต์ หากไฟล์ไม่ได้อยู่ใน Directory นี้ คุณจะต้องระบุ Path ที่ถูกต้องให้กับฟังก์ชันDotenv::createImmutable() - ลืม Include Autoloader: หากคุณลืม Include Autoloader ของ Composer คุณจะไม่สามารถใช้งาน Class
Dotenvได้ - ค่า Environment Variable ไม่ได้ถูกกำหนด: หากคุณพยายามเข้าถึง Environment Variable ที่ไม่ได้ถูกกำหนดไว้ในไฟล์
.envฟังก์ชันgetenv()จะ Return ค่าfalse
สรุป:
การใช้ .env เป็นวิธีที่มีประสิทธิภาพในการจัดการ Environment Variables ในโปรเจกต์ PHP ของคุณ ช่วยให้คุณสามารถแยกค่าคอนฟิกูเรชันออกจากโค้ด, เพิ่มความปลอดภัยให้กับข้อมูลสำคัญ, และทำให้การจัดการค่าคอนฟิกูเรชันเป็นระบบมากขึ้น ในบทความถัดไป เราจะมาเรียนรู้เกี่ยวกับการ Deploy แอปพลิเคชัน PHP เบื้องต้นไปยัง Shared Hosting