GORAGOD.com

แก้ปัญหาการอัปโหลดไฟล์ขนาดใหญ่ด้วย PHP

โดยปกติแล้วค่าเริ่มต้นการอัปโหลดไฟล์ของ PHP ถูกกำหนดไว้ที่ 2M ซึ่งก็เพียงพอสำหรับการอัปโหลดไฟล์รูปภาพทั่วๆไป แต่ในบางกรณีที่เราต้องการอัปโหลดไฟล์ประเภทอื่นๆที่มักมีขนาดใหญ่กว่านี้ (เช่น pdf doc หรือแม้แต่ไฟล์วีดีโอ) ขนาด 2M อาจไม่เพียงพอ


การกำหนดค่าเพื่อให้สามารถอัปโหลดไฟล์ขนาดใหญ่ได้ สามารถกำหนดได้ที่ตัวแปร 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 ตัว
  1. post_max_size หมายถึงกำหนดปริมาณการโพสต์สูงสุด ค่านี้ต้องมากกว่าขนาดสูงสุดของไฟล์ที่อัปโหลด รวมกับขนาดของค่าอื่นๆที่โพสต์มาพร้อมๆกันกับฟอร์ม (ค่าเริ่มต้นอยู่ที่ 8M)
  2. memory_limit หมายถึง กำหนดการใช้งานหน่วยความจำสูงสุดของ PHP ต่อการประมวลผล 1 ครั้ง (ค่าเริ่มต้นอยู่ที่ 128M)
หมายเหตุ ค่าเริ่มต้นที่อ้างอิงเป็นค่าเริ่มต้นของ PHP แต่ค่าเริ่มต้นที่แท้จริงของแต่ละ Host อาจมีการเปลี่ยนแปลงแล้วตามที่ผู้ดูแลกำหนด

ทั้ง 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 ไว้) สามารถใส่ @ นำหน้าคำสั่งได้