跳到主要内容

เนื้อหาภาษาไทย / 泰语内容

系统指南 内容已审核

การโหลดไฟล์ .env ด้วย Dotenv

บทความนี้อธิบายวิธีการโหลดไฟล์ `.env` ในโปรเจกต์ PHP ด้วย Package Dotenv โดยเน้นการใช้งาน `Dotenv::createImmutable()` เพื่อความปลอดภัยและความมั่นคงของค่าคอนฟิก...

การโหลดไฟล์ .env ด้วย Dotenv

หลังจากที่เราได้สร้างไฟล์ .env และติดตั้ง Package Dotenv เรียบร้อยแล้ว ขั้นตอนต่อไปคือการโหลดไฟล์ .env เข้ามาใช้งานในโปรเจกต์ PHP ของเรา เพื่อให้เราสามารถเข้าถึงค่าคอนฟิกต่างๆ ที่เก็บไว้ในไฟล์นั้นได้ บทนี้จะอธิบายวิธีการโหลดไฟล์ .env ด้วย Dotenv อย่างละเอียด พร้อมทั้งยกตัวอย่างการใช้งานจริงและข้อควรระวังที่พบบ่อย

Dotenv::createImmutable() vs Dotenv::load()

Dotenv มีสองวิธีหลักในการโหลดไฟล์ .env คือ Dotenv::createImmutable() และ Dotenv::load() ซึ่งมีความแตกต่างกันเล็กน้อยในเรื่องของการทำงานและความปลอดภัย

  • Dotenv::createImmutable(): วิธีนี้จะสร้าง instance ของ Dotenv ที่ไม่สามารถเปลี่ยนแปลงได้ (immutable) หลังจากที่โหลดไฟล์ .env แล้ว เหมาะสำหรับ Production Environment ที่ต้องการความมั่นคงของค่าคอนฟิก และป้องกันการแก้ไขค่าคอนฟิกโดยไม่ได้ตั้งใจ
  • Dotenv::load(): วิธีนี้จะโหลดไฟล์ .env และอนุญาตให้แก้ไขค่าคอนฟิกได้ เหมาะสำหรับ Development Environment ที่ต้องการความยืดหยุ่นในการปรับเปลี่ยนค่าคอนฟิก

โดยทั่วไปแล้ว Dotenv::createImmutable() เป็นตัวเลือกที่แนะนำมากกว่า เนื่องจากมีความปลอดภัยและความมั่นคงมากกว่า แต่ในบทเรียนนี้ เราจะเน้นการใช้งาน Dotenv::createImmutable() เป็นหลัก

การใช้งาน Dotenv::createImmutable()

Dotenv::createImmutable() ต้องการ path ที่จะค้นหาไฟล์ .env เป็น parameter โดย path นี้จะเป็น absolute path หรือ relative path ก็ได้ ถ้า path เป็น relative path จะอ้างอิงจาก directory ที่ script PHP กำลังทำงานอยู่

ตัวอย่างการใช้งาน:

<?php

require_once __DIR__ . '/vendor/autoload.php';

// โหลดไฟล์ .env จาก directory ปัจจุบัน
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

// เข้าถึงค่าจาก .env
$dbHost = $_ENV['DB_HOST'];
$dbUser = $_ENV['DB_USER'];

echo "Database Host: " . $dbHost . PHP_EOL;
echo "Database User: " . $dbUser . PHP_EOL;

?>

คำอธิบาย:

  1. require_once __DIR__ . '/vendor/autoload.php';: บรรทัดนี้เป็นการ include Autoloader ของ Composer เพื่อให้เราสามารถใช้งาน Class ต่างๆ ที่ติดตั้งผ่าน Composer ได้
  2. $dotenv = Dotenv\Dotenv::createImmutable(__DIR__);: บรรทัดนี้เป็นการสร้าง instance ของ Dotenv โดยระบุ path เป็น __DIR__ ซึ่งหมายถึง directory ที่ script นี้อยู่
  3. $dotenv->load();: บรรทัดนี้เป็นการโหลดไฟล์ .env จาก path ที่ระบุไว้
  4. $dbHost = $_ENV['DB_HOST']; และ $dbUser = $_ENV['DB_USER'];: บรรทัดเหล่านี้เป็นการเข้าถึงค่าจากไฟล์ .env ผ่านตัวแปร $_ENV

กรณีใช้งานจริง:

สมมติว่าเรามีไฟล์ .env ที่เก็บข้อมูลการเชื่อมต่อฐานข้อมูลดังนี้:

DB_HOST=localhost
DB_USER=root
DB_PASSWORD=secret
DB_NAME=mydatabase

เราสามารถใช้ Dotenv เพื่อโหลดค่าเหล่านี้และนำไปใช้ในการเชื่อมต่อฐานข้อมูลได้ดังนี้:

<?php

require_once __DIR__ . '/vendor/autoload.php';

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

$dbHost = $_ENV['DB_HOST'];
$dbUser = $_ENV['DB_USER'];
$dbPassword = $_ENV['DB_PASSWORD'];
$dbName = $_ENV['DB_NAME'];

try {
    $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPassword);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected to database successfully!" . PHP_EOL;
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage() . PHP_EOL;
}

?>

การตั้งค่า Path ที่ถูกต้อง

การตั้งค่า path ที่ถูกต้องเป็นสิ่งสำคัญมาก หาก path ไม่ถูกต้อง Dotenv จะไม่สามารถหาไฟล์ .env ได้ และจะทำให้โปรแกรมทำงานผิดพลาด

ตัวอย่าง:

สมมติว่าไฟล์ .env ของเราอยู่ใน directory ชื่อ config ซึ่งอยู่ใน directory เดียวกับ script PHP ของเรา เราจะต้องระบุ path เป็น __DIR__ . '/config' ดังนี้:

<?php

require_once __DIR__ . '/vendor/autoload.php';

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/config');
$dotenv->load();

// ...
?>

ข้อควรระวัง:

  • ตรวจสอบให้แน่ใจว่า path ที่ระบุถูกต้อง และไฟล์ .env อยู่ใน directory นั้นจริงๆ
  • ถ้าใช้ relative path ให้ระวังเรื่อง current working directory ของ script PHP

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

1. ไฟล์ .env ไม่ถูกโหลด:

อาการ: เมื่อพยายามเข้าถึงค่าจาก $_ENV จะได้ค่า NULL หรือ error "Undefined index"

สาเหตุ:

  • Path ที่ระบุไม่ถูกต้อง
  • ไฟล์ .env ไม่มีอยู่จริง
  • Composer Autoloader ยังไม่ได้ถูก include

วิธีแก้ไข:

  • ตรวจสอบ path ที่ระบุให้ถูกต้อง
  • ตรวจสอบว่าไฟล์ .env อยู่ใน directory ที่ระบุ
  • ตรวจสอบว่าได้ include Composer Autoloader แล้ว (require_once __DIR__ . '/vendor/autoload.php';)

2. Error "Allowed memory size exhausted":

อาการ: PHP แสดง error "Allowed memory size exhausted"

สาเหตุ: ไฟล์ .env มีขนาดใหญ่เกินไป หรือมีตัวแปรจำนวนมาก

วิธีแก้ไข:

  • ลดขนาดไฟล์ .env โดยลบตัวแปรที่ไม่จำเป็นออก
  • เพิ่ม memory limit ของ PHP ในไฟล์ php.ini (memory_limit = 128M หรือมากกว่า)

สรุป

การโหลดไฟล์ .env ด้วย Dotenv เป็นขั้นตอนสำคัญในการจัดการค่าคอนฟิกของโปรเจกต์ PHP อย่างถูกต้องและปลอดภัย โดยการใช้ Dotenv::createImmutable() จะช่วยให้ค่าคอนฟิกมีความมั่นคงและป้องกันการแก้ไขโดยไม่ได้ตั้งใจ การระบุ path ที่ถูกต้อง และการแก้ไขข้อผิดพลาดที่พบบ่อย จะช่วยให้เราสามารถโหลดไฟล์ .env และเข้าถึงค่าคอนฟิกต่างๆ ได้อย่างราบรื่น ในบทต่อไป เราจะมาเรียนรู้วิธีการเข้าถึงค่า Environment Variables ที่โหลดเข้ามาแล้ว

Office.in.th Custom Service

想基于此结构开发或定制系统?

Office.in.th 承接企业级 Web Application、API Integration 以及政府/企业管理系统的设计与开发,并提供长期支持。

查看软件开发服务