วิธีใช้ไฟล์ .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_filesize
post_max_size
memory_limit
display_errors
log_errors
max_execution_time
session.save_path
date.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.ini
1
2
2
จากนั้นเปิดไฟล์ .user.ini
ด้วยโปรแกรมแก้ไขข้อความ แล้วเพิ่มคำสั่ง PHP ตั้งค่าลงไป ตัวอย่าง:
ini
; กำหนดขนาดอัปโหลดไฟล์สูงสุดเป็น 20MB
upload_max_filesize = 20M
; กำหนดหน่วยความจำสูงสุดสำหรับสคริปต์ PHP เป็น 256MB
memory_limit = 256M
; แสดงข้อผิดพลาด (แนะนำเฉพาะในสภาพแวดล้อมพัฒนา)
display_errors = On
1
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
อย่างดีเยี่ยมนี้เองคือตัวอย่างที่ดีของแนวทางนั้น