لماذا لا يسمح PHP برفع ملف أكبر من 2 ميجابايت؟
\nهل سبق لك أن حاولت رفع صورة عالية الجودة أو عرض تقديمي أو فيديو إلى موقع الويب، وأجابك PHP بجفاف: «The uploaded file exceeds the upload_max_filesize directive in php.ini»؟ مألوف؟ هذه مشكلة كلاسيكية تظهر في كل مشروع ثانٍ. على Stack Overflow، حصد سؤال «Change the maximum upload file size» عشرات الآلاف من المشاهدات - وهذا ليس من قبيل الصدفة.
\nفي هذه المقالة، سنشرح كيف يعمل حد رفع الملفات في PHP، وأين يتم ضبطه، وكيفية زيادة الحد بشكل صحيح. ستتعلم ليس فقط عن upload_max_filesize، ولكن أيضًا عن المزالق التي قد تضيع كل جهودك.
كيف يحد PHP من رفع الملفات؟
\nعند إرسال ملف عبر نموذج، يتحقق PHP من حجمه على عدة مستويات. إذا لم يمر أي منها - فلن يتم رفع الملف. دعنا نستعرض ثلاثة معاملات رئيسية تحتاج إلى تغييرها حتى يعمل تغيير الحد الأقصى لحجم الملف المرفوع بشكل صحيح.
\n\n1. upload_max_filesize - الحد المباشر للملف
\nهذا هو المعامل الأكثر وضوحًا. يحدد الحد الأقصى لحجم ملف واحد يتم رفعه. افتراضيًا، في PHP هو 2M (2 ميجابايت). للزيادة، على سبيل المثال، إلى 100 ميجابايت، اكتب:
upload_max_filesize = 100M\n\n2. post_max_size - حجم طلب POST بالكامل
\nهنا يقع الكثيرون في الفخ. حتى لو قمت بزيادة upload_max_filesize ولكن نسيت post_max_size، فلن يعمل الرفع. لماذا؟ لأن الملف يُرسل داخل طلب POST، وإذا تجاوز حجم الطلب بالكامل الحد - فسيقوم PHP ببساطة بقصه.
القاعدة بسيطة: يجب أن يكون post_max_size أكبر من upload_max_filesize. عادةً ما يتم تعيينه أكبر بنسبة 20-30%. مثال:
post_max_size = 120M\n\n3. max_execution_time - وقت الرفع
\nالملفات الكبيرة لا تُرفع فورًا. إذا كان وزن الملف 100 ميجابايت والإنترنت بطيء، فقد لا يكتمل السكربت في الوقت المخصص. افتراضيًا، max_execution_time = 30 ثانية. للملفات الكبيرة، قم بزيادته إلى 300-600 ثانية:
max_execution_time = 600\n\n4. memory_limit - الذاكرة للمعالجة
\nبعض سكربتات PHP تقوم بتحميل الملف إلى الذاكرة قبل المعالجة. إذا كان memory_limit أصغر من حجم الملف - ستحصل على خطأ. يُوصى بتعيينه أكبر من post_max_size:
memory_limit = 256M\n\nأين وكيف تغير الإعدادات؟
\nالآن بعد أن عرفنا المعاملات المسؤولة عن تغيير الحد الأقصى لحجم الملف المرفوع، دعنا نستعرض أين يمكن تغييرها. لديك ثلاثة طرق رئيسية:
\n\nالطريقة 1: php.ini (ملف الإعدادات الرئيسي)
\nهذه هي الطريقة الأكثر موثوقية. ابحث عن ملف php.ini على الخادم (عادةً ما يكون في /etc/php/ أو /usr/local/etc/). افتحه وابحث عن التوجيهات المطلوبة. إذا لم تكن موجودة - أضفها في نهاية الملف:
; السماح برفع الملفات (يجب أن يكون On)\nfile_uploads = On\n\n; الحد الأقصى لحجم ملف واحد\nupload_max_filesize = 100M\n\n; الحد الأقصى لحجم طلب POST\npost_max_size = 120M\n\n; وقت تنفيذ السكربت\nmax_execution_time = 600\n\n; حد الذاكرة\nmemory_limit = 256M\nبعد التغييرات، تأكد من إعادة تشغيل خادم الويب:
\nsudo service apache2 restart # لأباتشي\nsudo service nginx restart # لـ Nginx\n\nالطريقة 2: .htaccess (لأباتشي فقط)
\nإذا لم يكن لديك وصول إلى php.ini (على سبيل المثال، في الاستضافة)، يمكنك المحاولة عبر .htaccess في جذر الموقع:
php_value upload_max_filesize 100M\nphp_value post_max_size 120M\nphp_value max_execution_time 600\nphp_value memory_limit 256M\nهام: هذه الطريقة تعمل فقط