Сайтнинг админ панелида катта фотосурат, PDF каталог ёки плагин архивини юкламоқчи бўлсангиз, баъзан "Файл ҳажми рухсат этилганидан катта" деган хабар чиқади, баъзан эса форма ҳеч қандай хатосиз шунчаки бўш қайтади. Иккала ҳолатда ҳам сабаб кўпинча PHP'нинг файл юклаш чегараларида. Бу чегаралар бир нечта ва улар бир-бирига боғлиқ, шунинг учун фақат биттасини ошириш кўпинча натижа бермайди. Қуйида ҳар бир параметр нимани бошқаришини ва уларни қандай биргаликда созлашни тушунтирамиз.
Файл юклашни қайси созламалар чеклайди
Асосий параметр upload_max_filesize. У битта юкланаётган файлнинг энг катта ҳажмини белгилайди ва PHP'нинг стандарт қиймати атиги 2 MB. Иккинчи параметр post_max_size бутун POST сўровининг ҳажмини чеклайди, яъни формадаги барча файллар ва матн майдонлари йиғиндисини. Унинг стандарт қиймати 8 MB. Учинчиси max_file_uploads битта сўровда нечта файл юклаш мумкинлигини белгилайди, стандарт ҳолатда 20 та.
Бу параметрлар ўртасида мантиқий тартиб бор: post_max_size ҳар доим upload_max_filesize дан катта бўлиши керак, чунки файл сўровнинг бир қисми. Агар бир формада бир нечта файл юборилса, post_max_size уларнинг умумий ҳажмини сиғдира олиши лозим. PHP ҳужжатларида memory_limit ҳам одатда post_max_size дан катта бўлиши тавсия этилади. Файл юклаш вақти узоқ бўлса, max_input_time ва max_execution_time ҳам аҳамиятга эга бўлади.
| Параметр | Нимани чеклайди | Стандарт қиймат |
|---|---|---|
upload_max_filesize | Битта файл ҳажми | 2M |
post_max_size | Бутун сўров ҳажми | 8M |
max_file_uploads | Бир сўровдаги файллар сони | 20 |
Хостинг провайдерлари одатда бу қийматларни стандартдан каттароқ қилиб қўяди, шунинг учун аниқ рақамни ўз сайтингизда текшириб кўриш керак.
Нега форма хатосиз бўш қайтади
Энг чалкаш ҳолат сўров post_max_size дан ошиб кетганда юз беради. Бунда PHP сўровни умуман қайта ишламайди: $_POST ва $_FILES массивлари бўш келади ва илова фойдаланувчига тушунарли хато кўрсата олмайди. Натижада саҳифа шунчаки янгиланади, киритилган маълумот йўқолади. Лог файлида эса қуйидагига ўхшаш огоҳлантириш қолади:
PHP Warning: POST Content-Length of 52428800 bytes exceeds the limit of 8388608 bytes in Unknown on line 0
Файл upload_max_filesize дан катта, лекин post_max_size дан кичик бўлса, вазият аниқроқ. Сўров қабул қилинади, лекин файл сақланмайди ва $_FILES['file']['error'] қиймати UPLOAD_ERR_INI_SIZE (1) бўлади. Яхши ёзилган илова шу кодни текшириб, фойдаланувчига ҳажм чегараси ҳақида хабар беради:
if ($_FILES['file']['error'] === UPLOAD_ERR_INI_SIZE) {
echo 'Fayl juda katta. Ruxsat etilgan hajm: ' . ini_get('upload_max_filesize');
}
413 Request Entity Too Large: веб-сервер чегараси
PHP созламаларини оширгандан кейин ҳам катта файл юкланмаса ва браузер 413 Request Entity Too Large саҳифасини кўрсатса, сўровни PHP'га етиб бормасдан веб-сервер рад этган. Nginx'да буни client_max_body_size параметри бошқаради ва унинг стандарт қиймати 1 MB. Apache'да шунга ўхшаш вазифани LimitRequestBody бажаради. Умумий хостингда бу сервер созламалари одатда мижоз қўлида эмас, шунинг учун бундай ҳолатда техник ёрдамга мурожаат қилиш керак. Ўз VPS серверингизда эса Nginx конфигурациясига қиймат қўшиб, хизматни қайта юклайсиз:
# /etc/nginx/conf.d/example.uz.conf, server bloki ichida
client_max_body_size 64m;
sudo nginx -t && sudo systemctl reload nginx
Созламаларни қаерда ўзгартириш мумкин
Умумий хостингда энг осон йўл хостинг панелидаги PHP созламалари. ISPmanager панелида сайт учун upload_max_filesize ва post_max_size қийматларини ўзгартириш мумкин, sayt.uz мижозлари панелга sayt.uz кабинетидан киради. PHP FPM ёки CGI режимида ишласа, сайт папкасидаги .user.ini файли ҳам ишлайди. Иккала параметрни ҳам бирга ўзгартиришни унутманг:
; .user.ini
upload_max_filesize = 64M
post_max_size = 72M
max_execution_time = 120
Бу параметрларни код ичида ini_set() билан ўзгартириб бўлмайди. Сабаби оддий: PHP сўровни скрипт ишга тушишидан олдин қабул қилади ва чегара шу босқичда текширилади, скрипт эса жуда кеч ишга тушади. .htaccess даги php_value эса фақат PHP Apache модули сифатида ишлаганда ишлайди, бошқа режимларда 500 хатога олиб келади.
Ўзгаришдан кейин натижани текшириш учун WordPress'да "Медиа" бўлимидаги юклаш ойнасида кўрсатилган "Максимал юклаш ҳажми" ёзувига қаранг. Бошқа сайтларда ini_get('upload_max_filesize') қийматини чиқарадиган вақтинчалик скрипт етарли.
Мисол: Бухородаги коллеж ва маъруза видеолари
Бухородаги касб-ҳунар коллежи misol.uz сайтида ўқитувчилар учун материаллар бўлими бор. Ўқитувчилар 5-10 MB лик PDF тақдимотларни муаммосиз юклашарди, лекин 300 MB лик маъруза видеосини юкламоқчи бўлишганда саҳифа узоқ кутиб, кейин бўш ҳолатда қайтган. Текширув post_max_size 64 MB эканини кўрсатди. Бу ерда чегарани 300 MB дан ошириш тўғри ечим бўлмади: секин интернет билан бундай юклаш бир неча дақиқа давом этади, узилса бошидан бошлаш керак бўлади ва сервер ресурслари банд бўлади. Шунинг учун PDF файллар учун чегара 64 MB қолдирилди, видеолар эса видео платформага жойланиб, сайтга фақат ўша видеонинг ҳаволаси ва плеери қўшиладиган бўлди.
Жуда катта файллар учун бошқа йўллар
Юз мегабайтлаб ёки гигабайтлаб файлларни браузер формаси орқали юклаш яхши ғоя эмас. Бунинг ўрнига қуйидаги усуллардан фойдаланиш анча ишончли:
- FTP ёки SFTP орқали юклаш: FileZilla ёки WinSCP каби дастурлар узилган юклашни давом эттира олади.
- Хостинг панелининг файл менежери орқали архивни юклаб, сўнг сервернинг ўзида очиш.
- Катта файлни бўлакларга бўлиб юклайдиган (
chunked upload) плагинлар ёки кутубхоналар. - Видеолар учун махсус видео платформалар, чунки улар видеони турли сифатларда тайёрлаб беради ва хостинг трафигини тежайди.
Чегараларни белгилашда сайтингиз амалда қандай файллар билан ишлашидан келиб чиқинг. Расмлар ва ҳужжатлар учун 32-64 MB одатда етарли, ундан каттаси учун эса юқоридаги муқобил йўллар хавфсизроқ. Ҳаддан ташқари катта чегара ёмон ниятли фойдаланувчига серверни катта сўровлар билан банд қилиш имконини ҳам беради.