แก้ปัญหาการอัปโหลดไฟล์ขนาดใหญ่ด้วย PHP
การกำหนดค่าเพื่อให้สามารถอัปโหลดไฟล์ขนาดใหญ่ได้ สามารถกำหนดได้ที่ตัวแปร upload_max_filesize ของ PHP ซึ่งมีวิธีกำหนดค่านี้ได้ 3 วิธี
1. กำหนดลงในไฟล์ PHP ในหน้าที่ submit มาจากการอัปโหลด 8M คือขนาดไฟล์สูงสุดที่ต้องการ
<?php
ini_set('upload_max_filesize', '8M');
?>
2. กำหนดค่า ลงในไฟล์ .htaccess
php_value upload_max_filesize 8M
3. กำหนดค่าลงใน PHP.ini
; Maximum allowed size for uploaded files.
upload_max_filesize = 8M
วิธีที่ 1 และ 2 อาจไม่สำเร็จหากมีการตั้ง Safe Mode ไว้ (ถ้าไม่สามารถใช้งานได้ จะเกิด Error 500) ซึ่งถ้าเป็นเช่นนั้น เราต้องกำหนดที่ PHP.ini เพียงวิธีเดียว
วิธีที่ 3 หากมีการแก้ไขไฟล์ PHP.ini หรือใช้วิธีนี้ หลังจากการแก้ไขจะต้อง restart apache ทุกครั้ง (ในกรณีของ แชร์ Host อาจไม่สามารถ กำหนดค่านี้ได้ด้วยตัวเองให้ลองติดต่อผู้ดูแล Server)
จริงๆแล้ว ปัญหาการอัปโหลดไฟล์ขนาดใหญ่ อาจไม่ได้หมดเพียงแค่นี้ เนื่องจากยังมีตัวแปรที่เกี่ยวข้องกับการอัปโหลดที่สำคัญอยู่อีก 2 ตัว
- post_max_size หมายถึงกำหนดปริมาณการโพสต์สูงสุด ค่านี้ต้องมากกว่าขนาดสูงสุดของไฟล์ที่อัปโหลด รวมกับขนาดของค่าอื่นๆที่โพสต์มาพร้อมๆกันกับฟอร์ม (ค่าเริ่มต้นอยู่ที่ 8M)
- memory_limit หมายถึง กำหนดการใช้งานหน่วยความจำสูงสุดของ PHP ต่อการประมวลผล 1 ครั้ง (ค่าเริ่มต้นอยู่ที่ 128M)
ทั้ง upload_max_filesize post_max_size และ memory_limit สามารถกำหนดค่าได้ทั้ง 3 ช่องทางเหมือนๆกัน
1. กำหนดลงในไฟล์ PHP
<?php
ini_set('memory_limit', '8M');
ini_set('upload_max_filesize', '8M');
ini_set('post_max_size', '32M');
?>
2.กำหนดในไฟล์ .htaccess
php_value upload_max_filesize 8M
php_value post_max_size 8M
php_value memory_limit = 32M
3.กำหนดในไฟล์ PHP.ini
; Maximum allowed size for uploaded files.
upload_max_filesize = 8M
; Maximum size of POST data that PHP will accept.
post_max_size = 8M
; Maximum amount of memory a script may consume
memory_limit = 32M
นอกจากนั้น โดยทั่วๆไปหากมีอัปโหลดไฟล์ขนาดใหญ่ อาจเกิด Timeout ขึ้นได้ครับ ให้เรากำหนดค่าเหล่านี้เพิ่มเติม ในไฟล์ PHP ที่มาจากการ submit การอัปโหลด
<?php
set_time_limit(0); // กำหนดเวลาการประมวลผล script (0 หมายถึงไม่กำหนดเวลาการทำงาน)
ini_set('max_input_time', 3600); // กำหนดเวลาการทำงานสูงสุดกับการส่งค่าด้วย $_GET $_POST และ $_FILES (วินาที)
ini_set('max_execution_time', 3600); // กำหนดเวลาการประมวลผล script (วินาที)
?>
หมายเหตุ เพื่อป้องการ error ในบรรทัดที่มีการกำหนดค่า (ในกรณีที่เปิด Safe Mode ไว้) สามารถใส่ @ นำหน้าคำสั่งได้