PlusMagi's Blog By Pitt Phunsanit Backend,Database PHP: การแยกคอนฟิกูเรชันตามสภาพแวดล้อม (Dev, Staging, Production)

PHP: การแยกคอนฟิกูเรชันตามสภาพแวดล้อม (Dev, Staging, Production)

ในโลกของการพัฒนาซอฟต์แวร์สมัยใหม่ แอปพลิเคชันไม่ได้รันอยู่แค่ที่เดียว แต่มีการเปลี่ยนแปลงสภาพแวดล้อมการทำงาน (Environment) อย่างน้อย 3 ระดับ คือ Development (Dev), Staging, และ Production การจัดการค่าพารามิเตอร์ต่างๆ ให้เหมาะสมกับแต่ละสภาพแวดล้อมจึงเป็นหัวใจสำคัญของการสร้างระบบที่มีความปลอดภัยและเสถียรภาพ

💡 แนวคิดสำคัญ: ทำไมต้องแยกคอนฟิกูเรชัน?

คอนฟิกูเรชัน (Configuration) คือชุดของค่าพารามิเตอร์และตัวแปรที่กำหนดว่าส่วนต่างๆ ของระบบจะทำงานอย่างไร เช่น พาสเวิร์ดฐานข้อมูล (DB Credentials), API Key ภายนอก, หรือโหมดการบันทึก Error Log

หลักการสำคัญที่ต้องทราบคือ ค่าเหล่านี้มักจะแตกต่างกันตามสภาพแวดล้อม การใช้ค่าเดียวสำหรับทุกสภาพแวดล้อมจึงเป็นความเสี่ยงด้านความปลอดภัย (Security Risk) และทำให้ระบบไม่สามารถทำงานได้อย่างถูกต้องเมื่อย้ายไปยัง Production ได้

⚙️ การทำความเข้าใจสภาพแวดล้อม (Environments)

การแยกคอนฟิกูเรชันไม่ได้หมายถึงแค่การเปลี่ยนค่า แต่หมายถึงการเปลี่ยนพฤติกรรมของแอปพลิเคชัน:

  • Development (Dev): สำหรับนักพัฒนา ใช้สำหรับการทดสอบโค้ดใหม่ๆ สามารถยอมให้เกิด Error หรือใช้ฐานข้อมูลจำลองได้
  • Staging: เป็นสภาพแวดล้อมที่จำลอง Production มากที่สุด ใช้สำหรับการทดสอบ End-to-End (E2E) ก่อนปล่อยจริง
  • Production (Prod): สภาพแวดล้อมจริงที่ผู้ใช้งานเข้าถึง ใช้ค่าที่ปลอดภัยที่สุดและต้องมีความเสถียรสูงสุด

🚀 วิธีการแยก Config ใน PHP ด้วย Environment Variables

วิธีที่ทันสมัยและปลอดภัยที่สุดในการจัดการค่า Config คือการใช้ Environment Variables แทนการ Hardcode ค่าไว้ในไฟล์โค้ด การทำเช่นนี้ทำให้เราสามารถเปลี่ยนค่าทั้งหมดได้โดยไม่ต้องแตะโค้ดแม้แต่บรรทัดเดียว

ในบริบทของ PHP และการเชื่อมต่อกับ PostgreSQL เราจะใช้ฟังก์ชัน getenv() เพื่อดึงค่าที่ถูกตั้งไว้ในระบบปฏิบัติการ:

PHP

<?php
// 1. ดึงค่า Environment Variables
$db_host = getenv('DB_HOST') ?: 'localhost';
$db_name = getenv('DB_NAME') ?: 'default_db';
$db_user = getenv('DB_USER') ?: 'user';
$db_pass = getenv('DB_PASS') ?: 'password';

// 2. สร้าง Connection String
$connection_string = "pgsql:host=$db_host;dbname=$db_name";

// 3. เชื่อมต่อ (การเชื่อมต่อจริงควรใช้ PDO)
try {
    $pdo = new PDO($connection_string, $db_user, $db_pass);
    echo "Successfully connected to the database for environment: " . getenv('APP_ENV');
} catch (PDOException $e) {
    die("Connection failed: " . $e->getMessage());
}

✅ Best Practices และบทสรุป

การใช้ Environment Variables ช่วยให้โค้ดของเรามีความยืดหยุ่นสูง (Decoupling) และปลอดภัยอย่างมาก สิ่งที่ควรปฏิบัติคือ:

  1. ใช้ไฟล์ .env: ใช้ไลบรารีเช่น Dotenv เพื่อโหลดค่า Config จากไฟล์ `.env` ในระหว่างการพัฒนา
  2. ห้าม Commit Secrets: ต้องเพิ่มไฟล์ `.env` เข้าไปใน `.gitignore` เสมอ เพื่อป้องกันไม่ให้รหัสผ่านหรือ API Key ถูกอัปโหลดขึ้น Git Repository
  3. การจัดการ Environment: เมื่อ Deploy ไปยัง Staging หรือ Production ให้ตั้งค่า Environment Variables เหล่านั้นผ่านระบบ CI/CD (เช่น GitHub Actions, GitLab CI) แทนการใส่ในไฟล์

การปฏิบัติตามแนวทางเหล่านี้จะช่วยให้แอปพลิเคชันของคุณมีความเสถียร ปลอดภัย และพร้อมสำหรับการทำงานในทุกสภาพแวดล้อมได้อย่างมืออาชีพ

Exit mobile version