วิธีใช้ไฟล์ .user.ini ใน ServBay: คู่มือปรับแต่ง PHP เฉพาะโปรเจกต์
ServBay เป็นโซลูชันสำหรับนักพัฒนาเว็บที่ครบวงจร มีประสิทธิภาพและยืดหยุ่น รองรับหลากหลายภาษาและเทคโนโลยี รวมถึงการเปลี่ยนเวอร์ชัน PHP และการตั้งค่าง่าย ๆ สำหรับโปรเจกต์แต่ละตัว ในการพัฒนาแต่ละโปรเจกต์ อาจต้องปรับค่าการตั้งค่า PHP เฉพาะ เช่น ขนาดอัปโหลดไฟล์, ข้อจำกัดหน่วยความจำ, หรือระดับการแสดงข้อผิดพลาด ซึ่งหากไปแก้ที่ php.ini ส่วนกลาง จะมีผลกับทุกโปรเจกต์ ทำให้จัดการหลายโปรเจกต์ได้ยาก
โชคดีที่ PHP มีระบบ .user.ini ที่เปิดให้กำหนดค่าการตั้งค่า PHP แบบเฉพาะไดเรกทอรี โดยไม่ต้องยุ่งกับ php.ini ส่วนกลาง ServBay รองรับ .user.ini อย่างสมบูรณ์ ช่วยให้ปรับแต่งการตั้งค่า PHP แบบเฉพาะไดเรกทอรีหรือโปรเจกต์ได้ง่ายและสะดวก
บทความนี้จะแนะนำหลักการทำงานของไฟล์ .user.ini วิธีสร้าง และการใช้งานไฟล์นี้ใน ServBay พร้อมตัวอย่างการปรับแต่งการตั้งค่า PHP สำหรับโปรเจกต์ของคุณ
.user.ini คืออะไร
.user.ini คือไฟล์ที่ PHP เพิ่มเข้ามาตั้งแต่เวอร์ชัน 5.3.0 เพื่อให้สามารถกำหนดค่าการตั้งค่า PHP สำหรับแต่ละไดเรกทอรีได้อย่างปลอดภัยและยืดหยุ่นกว่าแต่ก่อน (ซึ่งใช้ php_value หรือ php_flag ผ่าน .htaccess ของ Apache) เพียงแค่ใส่ไฟล์ .user.ini ลงในไดเรกทอรีที่ต้องการตั้งค่า โดยค่าที่กำหนดจะมีผลกับสคริปต์ PHP ในไดเรกทอรีนั้นและไดเรกทอรีย่อยทุกระดับ
คุณสมบัติหลัก
- มีผลเฉพาะพื้นที่: ค่าตั้งค่าใน
.user.iniจะมีผลเฉพาะไดเรกทอรีที่วางและไดเรกทอรีย่อย ไม่กระทบไฟล์กำหนดค่าทั่วไป (php.ini) หรือโปรเจกต์อื่น - ยืดหยุ่นสูง: นักพัฒนาเลือกปรับแต่งค่า PHP เฉพาะโปรเจกต์ได้ตามจริง
- จัดการง่าย: ไม่ต้องแก้ค่าระดับเซิร์ฟเวอร์ ลดความเสี่ยงเรื่องค่าชนกัน (conflict) และง่ายต่อการพกพาโปรเจกต์
- ไม่ต้องรีสตาร์ท: ต่างจากการแก้ไข
php.iniที่มักต้องรีสตาร์ท PHP-FPM หรือเว็บเซิร์ฟเวอร์ การเปลี่ยนค่าใน.user.iniจะมีผลโดยอัตโนติหลังจากเวลาที่ตั้งไว้ในuser_ini.cache_ttl(ค่าเริ่มต้นมักเป็น 300 วินาที หรือ 5 นาที)
คำสั่งที่สามารถตั้งค่าได้
ไม่ได้ทุกคำสั่งใน PHP สามารถตั้งค่าใน .user.ini ได้ ขึ้นอยู่กับ “Changeable Modes” ของแต่ละคำสั่ง เฉพาะโหมด PHP_INI_USER, PHP_INI_PERDIR, หรือ PHP_INI_ALL เท่านั้นที่สามารถใช้ใน .user.ini
ตัวอย่างคำสั่งที่นิยมใช้กับ .user.ini:
upload_max_filesizepost_max_sizememory_limitdisplay_errorslog_errorsmax_execution_timesession.save_pathdate.timezone
แต่คำสั่งที่ระบุเป็น PHP_INI_SYSTEM (เช่น extension_dir, zend_extension, disable_functions เป็นต้น) ไม่สามารถ ตั้งค่าใน .user.ini ได้ จะต้องตั้งที่ php.ini หลักหรือในคอนฟิกของเว็บเซิร์ฟเวอร์เท่านั้น
คุณสามารถตรวจสอบโหมดของแต่ละคำสั่งได้ใน รายการคำสั่ง php.ini บนเว็บไซต์ PHP
การใช้งาน .user.ini บน ServBay
กระบวนการนี้ตรงไปตรงมา ยกตัวอย่างการตั้งค่า upload_max_filesize และ memory_limit สำหรับโปรเจกต์หนึ่ง
สมมุติโฟลเดอร์รากของเว็บไซต์อยู่ที่ /Applications/ServBay/www/ และคุณต้องการปรับแต่ง PHP สำหรับโปรเจกต์ชื่อว่า myproject โดยโฟลเดอร์เว็บรากคือ /Applications/ServBay/www/myproject/public
ขั้นตอนที่ 1: ระบุไดเรกทอรีเป้าหมาย
ก่อนอื่น กำหนดไดเรกทอรีที่จะใช้ค่าตั้งค่า PHP แบบกำหนดเอง มักจะเป็นไดเรกทอรีรากของเว็บโปรเจกต์ (เช่นโฟลเดอร์ public ของ Laravel หรือ Symfony) หรือไดเรกทอรีย่อยเฉพาะตามต้องการ
ตัวอย่าง: /Applications/ServBay/www/myproject/public
ขั้นตอนที่ 2: สร้างหรือแก้ไขไฟล์ .user.ini
สร้างไฟล์ชื่อ .user.ini ในโฟลเดอร์เป้าหมาย (ถ้ามีอยู่แล้วก็แก้ไขเพิ่มได้) หมายเหตุ ไฟล์นี้ขึ้นต้นด้วยจุด อาจถูกซ่อนไว้ในไฟล์ซิสเต็ม กรุณาตั้งค่าให้แสดงไฟล์ซ่อนในโปรแกรมจัดการไฟล์ของคุณ
สร้างไฟล์โดยใช้เทอร์มินัล:
bash
cd /Applications/ServBay/www/myproject/public
touch .user.ini1
2
2
จากนั้นเปิดไฟล์ .user.ini ด้วยโปรแกรมแก้ไขข้อความ แล้วเพิ่มคำสั่ง PHP ตั้งค่าลงไป ตัวอย่าง:
ini
; กำหนดขนาดอัปโหลดไฟล์สูงสุดเป็น 20MB
upload_max_filesize = 20M
; กำหนดหน่วยความจำสูงสุดสำหรับสคริปต์ PHP เป็น 256MB
memory_limit = 256M
; แสดงข้อผิดพลาด (แนะนำเฉพาะในสภาพแวดล้อมพัฒนา)
display_errors = On1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
บันทึกและปิดไฟล์
ขั้นตอนที่ 3: รอการตั้งค่ามีผลหรือบังคับรีเฟรช
ไฟล์ .user.ini จะไม่ถูกอ่านแบบทันที PHP จะมีการแคชในหน่วยความจำโดยตั้งค่า user_ini.cache_ttl ตามเวลาที่กำหนด (ค่าปกติ 300 วินาที หรือ 5 นาที) เมื่อครบกำหนด การตั้งค่าจะถูกโหลดใหม่โดยอัตโนมัติ
คุณสามารถเลือกวิธีนี้เพื่อให้เห็นผลการเปลี่ยนแปลงทันที (ขึ้นกับ ServBay ที่ใช้งานและวิธีตั้งค่า):
- รีสตาร์ท PHP-FPM: ในแอปพลิเคชัน ServBay ให้ค้นหาเวอร์ชัน PHP ที่ใช้งาน แล้วสั่งหยุด/เริ่มบริการ PHP-FPM ใหม่
- รีสตาร์ท ServBay: วิธีที่แน่นอนที่สุด แต่จะหยุดการทำงานของบริการทั้งหมดชั่วคราว
- รอการหมดอายุแคช: วิธีที่แนะนำโดยทั่วไปหากไม่เร่งด่วน
ขั้นตอนที่ 4: ตรวจสอบว่า .user.ini มีผลหรือไม่
เพื่อเช็คว่าค่าที่ตั้งไว้ใน .user.ini ใช้งานจริงหรือไม่ สามารถสร้างไฟล์ PHP ง่าย ๆ เพื่อแสดงข้อมูลการตั้งค่าปัจจุบัน
สร้างไฟล์ชื่อ info.php ในไดเรกทอรีที่มี .user.ini (เช่น /Applications/ServBay/www/myproject/public) โดยให้มีเนื้อหาดังนี้:
php
<?php
phpinfo();
?>1
2
3
2
3
บันทึกไฟล์ info.php
เปิดเว็บเบราว์เซอร์ แล้วเข้าผ่านโดเมนที่ตั้งใน ServBay สำหรับโปรเจกต์นั้น เช่น https://myproject.servbay.demo/info.php
บนหน้า phpinfo() ให้ค้นหาคำสั่งที่ตั้งไว้ เช่น upload_max_filesize, memory_limit, display_errors ปกติจะมีสองคอลัมน์: Master Value (ค่าจาก php.ini หลัก) และ Local Value (ค่าที่ใช้จริง ที่อาจถูกกำหนดจาก .user.ini หรือคอนฟิกเว็บเซิร์ฟเวอร์)
Master Valueคือค่าหลักจากphp.iniส่วนกลางLocal Valueคือค่าที่ใช้งานจริงสำหรับสคริปต์นั้น ซึ่งอาจมาจาก.user.iniหรือการตั้งค่าบนเว็บเซิร์ฟเวอร์
หาก Local Value ตรงกับค่าที่คุณตั้งใน .user.ini (เช่น 20M, 256M, On) แสดงว่าไฟล์ .user.ini เริ่มทำงานแล้ว
หมายเหตุสำคัญ: หลังเช็คค่าต่าง ๆ เสร็จ เพื่อความปลอดภัยควรลบหรือจำกัดการเข้าถึงไฟล์ info.php เพราะจะแสดงข้อมูลคอนฟิกเซิร์ฟเวอร์โดยละเอียด
หมายเหตุเพิ่มเติมและข้อควรระวัง
- ชื่อไฟล์และตำแหน่ง: ต้องตั้งชื่อว่า
.user.iniเท่านั้น และวางในไดเรกทอรีที่ต้องการตั้งค่า โดยจะมีผลกับไดเรกทอรีและไดเรกทอรีย่อยทั้งหมด - โหมดของคำสั่ง: เน้นอีกครั้ง เฉพาะคำสั่งที่รองรับโหมดที่กล่าวไว้ข้างต้นถึงจะใช้ใน
.user.iniได้ หากตั้งค่าที่ไม่รองรับจะไม่เกิดผล หรือไม่มีข้อความแสดงข้อผิดพลาด กรุณาอ้างอิง คู่มือ PHP - การแคช: ตรวจสอบการตั้งค่า
user_ini.cache_ttlหากคุณต้องการดูผลเร็วขึ้น สามารถแก้ค่าดังกล่าวในphp.iniเป็นค่าที่ต่ำลงชั่วคราว เช่นuser_ini.cache_ttl = 5(แต่ไม่ควรใช้ค่าต่ำในระบบที่ใช้งานจริง เพราะจะกระทบประสิทธิภาพ) หลังปรับเปลี่ยน ต้องรีสตาร์ท PHP-FPM - ลำดับความสำคัญ: ลำดับของการตั้งค่า PHP คือ: ค่าระบบ <
php.ini(หรือ .ini เสริม) < การตั้งค่าบนเว็บเซิร์ฟเวอร์ (php_value/php_flag) <.user.ini< ฟังก์ชันini_set()ในโค้ด การตั้งค่าผ่าน.user.iniจะถูกแทนที่โดยini_set()หากถูกเรียกในสคริปต์ - ความปลอดภัย: หลีกเลี่ยงใส่ข้อมูลลับใน
.user.iniแม้จะมีผลแค่เฉพาะไดเรกทอรี แต่มักอยู่ในทาง accessible ของเว็บ (แต่ปกติคอนฟิกเว็บเซิร์ฟเวอร์จะป้องกันการเข้าถึงไฟล์นี้)
คำถามที่พบบ่อย (FAQ)
ถาม: สร้างไฟล์ .user.ini แล้ว แต่ค่าที่ตั้งไว้ไม่ทำงาน เกิดจากอะไร?
ตอบ: สาเหตุที่พบบ่อย ได้แก่:
- ชื่อไฟล์หรือที่อยู่ไม่ถูกต้อง: ต้องตั้งชื่อว่า
.user.iniและอยู่ในไดเรกทอรีที่ถูกต้องเท่านั้น - โหมดของคำสั่งไม่รองรับ: อาจปรับตั้งค่าที่ไม่สามารถใช้ใน
.user.ini(ดูจาก Changeable Mode) ดู คู่มือ PHP - การแคชยังไม่หมดอายุ: รอจนเคลียร์แคชตามเวลาที่กำหนดไว้ หรือรีสตาร์ท PHP-FPM
- มีข้อผิดพลาดไวยากรณ์: ตรวจสอบ syntax ในไฟล์
.user.ini - ถูกแทนที่โดยลำดับความสำคัญสูงกว่า: เช่น มีการใช้
ini_set()ในสคริปต์ที่รันอยู่
ถาม: .user.ini ต่างกับ php.ini หลักอย่างไร?
ตอบ: php.ini ส่วนกลางจะมีผลกับ PHP ทั้งระบบ (หรือทุกแอปของเวอร์ชันนั้น ๆ) และค่าที่ตั้งไว้จะมีผลกับทุกสคริปต์ (เว้นแต่ถูกแทนที่) ขณะที่ .user.ini มีผลเฉพาะไดเรกทอรีที่วางกับไดเรกทอรีย่อยและใช้ได้กับคำสั่งแบบเฉพาะเท่านั้น .user.ini เหมาะสำหรับปรับแต่งค่า PHP ในแต่ละโปรเจกต์โดยไม่เปลี่ยนค่าภาพรวม
สรุป
การใช้ไฟล์ .user.ini บน ServBay เป็นวิธีแนะนำสำหรับการปรับแต่งการตั้งค่า PHP เฉพาะแต่ละโปรเจกต์ มอบความยืดหยุ่นสูง ปรับแต่งง่าย ไม่กระทบกับโปรเจกต์อื่นหรือคอนฟิก ServBay หลัก คุณสามารถกำหนดค่า PHP ที่เหมาะสมกับแต่ละโปรเจกต์ได้โดยสะดวกยิ่งขึ้น ทั้งนี้ แนวทางดังกล่าวสอดคล้องกับปรัชญาของ ServBay ที่เน้นความแข็งแกร่งและยืดหยุ่นสำหรับนักพัฒนา—การรองรับ .user.ini อย่างดีเยี่ยมนี้เองคือตัวอย่างที่ดีของแนวทางนั้น
