โหลดตัวแปรสภาพแวดล้อมจาก .env
ถึง getenv()
, $_ENV
และ $_SERVER
โดยอัตโนมัติ
คุณไม่ควรเก็บข้อมูลรับรองที่ละเอียดอ่อนไว้ในโค้ดของคุณ การจัดเก็บการกำหนดค่าในสภาพแวดล้อมเป็นหนึ่งในหลักการของแอปสิบสองปัจจัย สิ่งใดก็ตามที่มีแนวโน้มที่จะเปลี่ยนแปลงระหว่างสภาพแวดล้อมการปรับใช้ เช่น ข้อมูลรับรองฐานข้อมูลหรือข้อมูลรับรองสำหรับบริการของบุคคลที่สาม ควรแยกออกจากโค้ดไปยังตัวแปรสภาพแวดล้อม
โดยพื้นฐานแล้ว ไฟล์ .env
เป็นวิธีง่ายๆ ในการโหลดตัวแปรการกำหนดค่าแบบกำหนดเองที่แอปพลิเคชันของคุณต้องการ โดยไม่ต้องแก้ไขไฟล์ .htaccess หรือโฮสต์เสมือน Apache/nginx ซึ่งหมายความว่าคุณไม่จำเป็นต้องแก้ไขไฟล์ใดๆ ภายนอกโปรเจ็กต์ และตัวแปรสภาพแวดล้อมทั้งหมดจะถูกตั้งค่าเสมอไม่ว่าคุณจะรันโปรเจ็กต์อย่างไร - Apache, Nginx, CLI และแม้แต่เว็บเซิร์ฟเวอร์ในตัวของ PHP มันง่ายกว่าวิธีอื่นๆ ที่คุณรู้จักในการตั้งค่าตัวแปรสภาพแวดล้อม และคุณจะต้องชอบมัน!
php_value
ให้กับไฟล์ .htaccessPHP dotenv เป็นเวอร์ชัน PHP ของ Ruby dotenv ดั้งเดิม
การติดตั้งนั้นง่ายมากผ่าน Composer:
$ composer require vlucas/phpdotenv
หรือเพิ่มด้วยมือลงในไฟล์ composer.json
ของคุณ
เราปฏิบัติตามการกำหนดเวอร์ชันเชิงความหมาย ซึ่งหมายความว่าการเปลี่ยนแปลงที่ไม่สมบูรณ์อาจเกิดขึ้นระหว่างรุ่นหลักๆ เรามีคู่มือการอัปเกรดสำหรับ V2 เป็น V3, V3 เป็น V4 และ V4 เป็น V5 ที่นี่
โดยทั่วไปไฟล์ .env
จะไม่อยู่ในการควบคุมเวอร์ชัน เนื่องจากอาจมีคีย์ API และรหัสผ่านที่ละเอียดอ่อน ไฟล์ .env.example
แยกต่างหากจะถูกสร้างขึ้นโดยมีตัวแปรสภาพแวดล้อมที่จำเป็นทั้งหมดที่กำหนดไว้ ยกเว้นตัวแปรที่ละเอียดอ่อน ซึ่งจัดหาโดยผู้ใช้สำหรับสภาพแวดล้อมการพัฒนาของตนเอง หรือได้รับการสื่อสารที่อื่นไปยังผู้ทำงานร่วมกันของโครงการ จากนั้นผู้ทำงานร่วมกันของโปรเจ็กต์จะคัดลอกไฟล์ .env.example
ไปยัง .env
ในเครื่องอย่างอิสระ และตรวจสอบให้แน่ใจว่าการตั้งค่าทั้งหมดถูกต้องสำหรับสภาพแวดล้อมในเครื่องของตน โดยกรอกคีย์ลับหรือระบุค่าของตนเองเมื่อจำเป็น ในการใช้งานนี้ ควรเพิ่มไฟล์ .env
ให้กับไฟล์ .gitignore
ของโปรเจ็กต์ เพื่อไม่ให้ผู้ทำงานร่วมกันกระทำการใดๆ การใช้งานนี้ทำให้แน่ใจได้ว่าจะไม่มีรหัสผ่านที่ละเอียดอ่อนหรือคีย์ API อยู่ในประวัติการควบคุมเวอร์ชัน ดังนั้นจึงมีความเสี่ยงน้อยลงจากการละเมิดความปลอดภัย และค่าการผลิตจะไม่ต้องแชร์กับผู้ทำงานร่วมกันในโปรเจ็กต์ทั้งหมด
เพิ่มการกำหนดค่าแอปพลิเคชันของคุณลงในไฟล์ .env
ในรากของโปรเจ็กต์ของคุณ ตรวจสอบให้แน่ใจว่าได้เพิ่มไฟล์ .env
ใน .gitignore
ของคุณแล้ว ดังนั้น จึงไม่ได้เช็คอินโค้ด
S3_BUCKET= " dotenv "
SECRET_KEY= " souper_seekret_key "
ตอนนี้สร้างไฟล์ชื่อ .env.example
และตรวจสอบสิ่งนี้ในโครงการ นี่ควรมีตัวแปร ENV ที่คุณต้องตั้งค่า แต่ค่าควรเว้นว่างไว้หรือเติมด้วยข้อมูลจำลอง แนวคิดก็คือเพื่อให้ผู้คนทราบว่าตัวแปรใดบ้างที่จำเป็น แต่ไม่ได้ให้คุณค่าการผลิตที่ละเอียดอ่อนแก่พวกเขา
S3_BUCKET= " devbucket "
SECRET_KEY= " abc123 "
จากนั้นคุณสามารถโหลด .env
ในแอปพลิเคชันของคุณด้วย:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ );
$ dotenv -> load ();
หากต้องการระงับข้อยกเว้นที่เกิดขึ้นเมื่อไม่มีไฟล์ .env
คุณสามารถ:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ );
$ dotenv -> safeLoad ();
คุณสามารถเลือกส่งชื่อไฟล์เป็นพารามิเตอร์ตัวที่สองได้ หากคุณต้องการใช้อย่างอื่นที่ไม่ใช่ .env
:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ , ' myconfig ' );
$ dotenv -> load ();
ขณะนี้ตัวแปรที่กำหนดทั้งหมดมีอยู่ใน $_ENV
และ $_SERVER
super-globals
$ s3_bucket = $ _ENV [ ' S3_BUCKET ' ];
$ s3_bucket = $ _SERVER [ ' S3_BUCKET ' ];
ไม่แนะนำให้ใช้ getenv()
และ putenv()
อย่างยิ่ง เนื่องจากฟังก์ชันเหล่านี้ไม่ปลอดภัยสำหรับเธรด อย่างไรก็ตาม ยังคงสามารถสั่งให้ PHP dotenv ใช้ฟังก์ชันเหล่านี้ได้ แทนที่จะเรียก Dotenv::createImmutable
เราสามารถเรียก Dotenv::createUnsafeImmutable
ซึ่งจะเพิ่ม PutenvAdapter
เบื้องหลัง ตอนนี้ตัวแปรสภาพแวดล้อมของคุณจะพร้อมใช้งานโดยใช้เมธอด getenv
เช่นเดียวกับ super-globals:
$ s3_bucket = getenv ( ' S3_BUCKET ' );
$ s3_bucket = $ _ENV [ ' S3_BUCKET ' ];
$ s3_bucket = $ _SERVER [ ' S3_BUCKET ' ];
เป็นไปได้ที่จะซ้อนตัวแปรสภาพแวดล้อมไว้ภายในตัวแปรอื่น ซึ่งมีประโยชน์ในการลดการเกิดซ้ำ
สิ่งนี้ทำได้โดยการล้อมตัวแปรสภาพแวดล้อมที่มีอยู่ใน ${…}
เช่น
BASE_DIR= " /var/webroot/project-root "
CACHE_DIR= " ${BASE_DIR} /cache "
TMP_DIR= " ${BASE_DIR} /tmp "
ความไม่เปลี่ยนรูปหมายถึงว่า Dotenv ได้รับอนุญาตให้เขียนทับตัวแปรสภาพแวดล้อมที่มีอยู่หรือไม่ หากคุณต้องการให้ Dotenv เขียนทับตัวแปรสภาพแวดล้อมที่มีอยู่ ให้ใช้ createMutable
แทน createImmutable
:
$ dotenv = Dotenv Dotenv :: createMutable ( __DIR__ );
$ dotenv -> load ();
เบื้องหลังนี่คือการสั่งสอน "repository" ว่าจะอนุญาติให้ไม่เปลี่ยนรูปหรือไม่ ตามค่าเริ่มต้น พื้นที่เก็บข้อมูลได้รับการกำหนดค่าให้อนุญาตให้เขียนทับค่าที่มีอยู่ตามค่าเริ่มต้น ซึ่งเกี่ยวข้องหากมีการเรียกเมธอด "สร้าง" โดยใช้ RepositoryBuilder
เพื่อสร้างพื้นที่เก็บข้อมูลที่กำหนดเองเพิ่มเติม:
$ repository = Dotenv Repository RepositoryBuilder :: createWithNoAdapters ()
-> addAdapter ( Dotenv Repository Adapter EnvConstAdapter ::class)
-> addWriter ( Dotenv Repository Adapter PutenvAdapter ::class)
-> immutable ()
-> make ();
$ dotenv = Dotenv Dotenv :: create ( $ repository , __DIR__ );
$ dotenv -> load ();
ตัวอย่างข้างต้นจะเขียนค่าที่โหลดไปที่ $_ENV
และ putenv
แต่เมื่อแก้ไขตัวแปรสภาพแวดล้อม เราจะอ่านจาก $_ENV
เท่านั้น ยิ่งไปกว่านั้น มันจะไม่แทนที่ตัวแปรใดๆ ที่ตั้งไว้ก่อนที่จะโหลดไฟล์
อีกตัวอย่างหนึ่ง เราสามารถระบุชุดของตัวแปรที่จะอนุญาตให้แสดงรายการได้ นั่นคือ เฉพาะตัวแปรในรายการอนุญาตเท่านั้นที่จะถูกโหลด:
$ repository = Dotenv Repository RepositoryBuilder :: createWithDefaultAdapters ()
-> allowList ([ ' FOO ' , ' BAR ' ])
-> make ();
$ dotenv = Dotenv Dotenv :: create ( $ repository , __DIR__ );
$ dotenv -> load ();
PHP dotenv มีฟังก์ชันการตรวจสอบความถูกต้องในตัว รวมถึงการบังคับใช้ตัวแปรสภาพแวดล้อมด้วย สิ่งนี้มีประโยชน์อย่างยิ่งในการแจ้งให้ผู้คนทราบตัวแปรที่จำเป็นอย่างชัดเจนซึ่งแอปของคุณจะไม่ทำงานหากไม่มี
คุณสามารถใช้สตริงเดียว:
$ dotenv -> required ( ' DATABASE_DSN ' );
หรืออาร์เรย์ของสตริง:
$ dotenv -> required ([ ' DB_HOST ' , ' DB_NAME ' , ' DB_USER ' , ' DB_PASS ' ]);
หากไม่มี vars ENV ใด ๆ Dotenv จะส่ง RuntimeException
เช่นนี้:
One or more environment variables failed assertions: DATABASE_DSN is missing
นอกเหนือจากการกำหนดให้ตั้งค่าตัวแปรแล้ว คุณยังอาจต้องแน่ใจว่าตัวแปรไม่ว่างเปล่า:
$ dotenv -> required ( ' DATABASE_DSN ' )-> notEmpty ();
หากตัวแปรสภาพแวดล้อมว่างเปล่า คุณจะได้รับข้อยกเว้น:
One or more environment variables failed assertions: DATABASE_DSN is empty
คุณอาจต้องตรวจสอบให้แน่ใจด้วยว่าตัวแปรมีค่าเป็นจำนวนเต็ม คุณสามารถทำสิ่งต่อไปนี้:
$ dotenv -> required ( ' FOO ' )-> isInteger ();
หากตัวแปรสภาพแวดล้อมไม่ใช่จำนวนเต็ม คุณจะได้รับข้อยกเว้น:
One or more environment variables failed assertions: FOO is not an integer.
อาจต้องการบังคับใช้กฎการตรวจสอบเมื่อมีการตั้งค่าตัวแปรเท่านั้น เราสนับสนุนสิ่งนี้ด้วย:
$ dotenv -> ifPresent ( ' FOO ' )-> isInteger ();
คุณอาจต้องตรวจสอบให้แน่ใจว่าตัวแปรอยู่ในรูปของบูลีน โดยยอมรับ "จริง" "เท็จ" "เปิด" "1" "ใช่" "ปิด" "0" และ "ไม่ใช่" คุณสามารถทำสิ่งต่อไปนี้:
$ dotenv -> required ( ' FOO ' )-> isBoolean ();
หากตัวแปรสภาพแวดล้อมไม่ใช่บูลีน คุณจะได้รับข้อยกเว้น:
One or more environment variables failed assertions: FOO is not a boolean.
ในทำนองเดียวกัน เราอาจเขียนว่า:
$ dotenv -> ifPresent ( ' FOO ' )-> isBoolean ();
นอกจากนี้ยังสามารถกำหนดชุดค่าที่ตัวแปรสภาพแวดล้อมของคุณควรเป็นได้ สิ่งนี้มีประโยชน์อย่างยิ่งในสถานการณ์ที่โค้ดของคุณรองรับตัวเลือกหรือไดรเวอร์เพียงไม่กี่ตัวเท่านั้น:
$ dotenv -> required ( ' SESSION_STORE ' )-> allowedValues ([ ' Filesystem ' , ' Memcached ' ]);
หากตัวแปรสภาพแวดล้อมไม่อยู่ในรายการค่าที่อนุญาต คุณจะได้รับข้อยกเว้นที่คล้ายกัน:
One or more environment variables failed assertions: SESSION_STORE is not an allowed value.
นอกจากนี้ยังสามารถกำหนด regex ที่ตัวแปรสภาพแวดล้อมของคุณควรเป็นได้
$ dotenv -> required ( ' FOO ' )-> allowedRegexValues ( ' ([[:lower:]]{3}) ' );
คุณสามารถแสดงความคิดเห็นในไฟล์ .env
ของคุณได้โดยใช้อักขระ #
เช่น
# this is a comment
VAR= " value " # comment
VAR=value # comment
บางครั้งคุณเพียงต้องการแยกวิเคราะห์ไฟล์และแก้ไขตัวแปรสภาพแวดล้อมที่ซ้อนกัน โดยให้สตริงแก่เรา และให้อาร์เรย์ส่งคืนกลับไปหาคุณ แม้ว่าสิ่งนี้จะเป็นไปได้อยู่แล้ว แต่ก็ค่อนข้างยุ่งยากเล็กน้อย ดังนั้นเราจึงได้จัดเตรียมวิธีการโดยตรงในการดำเนินการนี้:
// ['FOO' => 'Bar', 'BAZ' => 'Hello Bar']
Dotenv Dotenv :: parse ( " FOO=Bar n BAZ= " Hello $ {FOO} "" );
นี่เป็นสิ่งเดียวกันกับ:
Dotenv Dotenv :: createArrayBacked ( __DIR__ )-> load ();
เท่านั้น แทนที่จะจัดเตรียมไดเร็กทอรีเพื่อค้นหาไฟล์ คุณได้จัดเตรียมเนื้อหาไฟล์โดยตรง
เมื่อนักพัฒนารายใหม่โคลนโค้ดเบสของคุณ พวกเขาจะมีขั้นตอนแบบครั้งเดียวเพิ่มเติมในการคัดลอกไฟล์ .env.example
ไปยัง .env
ด้วยตนเอง และกรอกค่าของตนเอง (หรือรับค่าที่ละเอียดอ่อนจากเพื่อนร่วมงานในโปรเจ็กต์)
ในการตั้งค่าเซิร์ฟเวอร์บางอย่าง (มักพบในโฮสติ้งที่ใช้ร่วมกัน) PHP อาจปิดใช้งาน superglobals เช่น $_ENV
หรือ $_SERVER
หากไม่ได้ตั้งค่าตัวแปรเหล่านี้ ให้ตรวจสอบ variables_order
ในไฟล์ php.ini
ดูที่ php.net/manual/en/ini.core.php#ini.variables-order
หากคุณพบช่องโหว่ด้านความปลอดภัยภายในแพ็คเกจนี้ โปรดส่งอีเมลไปที่ [email protected] ช่องโหว่ด้านความปลอดภัยทั้งหมดจะได้รับการแก้ไขทันที คุณสามารถดูนโยบายความปลอดภัยฉบับเต็มของเราได้ที่นี่
PHP dotenv ได้รับอนุญาตภายใต้ BSD 3-Clause License
มีให้เป็นส่วนหนึ่งของการสมัครสมาชิก Tidelift
ผู้ดูแล vlucas/phpdotenv
และแพ็คเกจอื่นๆ หลายพันรายการกำลังทำงานร่วมกับ Tidelift เพื่อให้การสนับสนุนเชิงพาณิชย์และการบำรุงรักษาสำหรับการพึ่งพาโอเพ่นซอร์สที่คุณใช้ในการสร้างแอปพลิเคชันของคุณ ประหยัดเวลา ลดความเสี่ยง และปรับปรุงประสิทธิภาพของโค้ด ในขณะเดียวกันก็จ่ายค่าตอบแทนให้กับผู้ดูแลตามที่คุณใช้ เรียนรู้เพิ่มเติม