⏱️
Хостинг

max_execution_time: узоқ ишлайдиган PHP скриптлар билан тўғри ишлаш

11.11.2026
← Барча мақолалар

Маҳсулотларни импорт қилаётган скрипт, катта ҳисоботни яратаётган саҳифа ёки захира нусха олувчи плагин бир муддат ишлаб, кейин Fatal error: Maximum execution time of 30 seconds exceeded хатоси билан тўхтаб қолиши мумкин. Бу PHP'нинг max_execution_time созламаси ишга тушганини билдиради. Бу созлама битта скрипт қанча вақт ишлаши мумкинлигини чеклайди ва стандарт қиймати 30 сония. Қуйида бу чегара қандай ҳисобланиши, уни қачон ошириш ўринли экани ва қачон вазифанинг ўзини бошқача ташкил қилиш кераклигини кўриб чиқамиз.

Чегара қандай ҳисобланади

Кўпчилик бу чегарани соат бўйича ўтган вақт деб ўйлайди, лекин Linux серверларда бундай эмас. PHP ҳужжатларига кўра, max_execution_time фақат скриптнинг ўзи бажарилишига кетган вақтни ҳисоблайди. Базага юборилган сўров жавобини кутиш, ташқи API'дан маълумот юклаб олиш, sleep() ёки system() орқали чақирилган буйруқлар бу ҳисобга кирмайди. Windows серверларда эса ҳақиқий ўтган вақт ҳисобланади. Шунинг учун Linux'да секин ташқи API билан ишлайдиган скрипт бир неча дақиқа ишлаб турса ҳам PHP хатосини бермаслиги, лекин бошқа жойда узилиб қолиши мумкин.

Буйруқ қаторидан (CLI) ишга туширилган скриптлар учун стандарт қиймат 0, яъни вақт бўйича чеклов йўқ. Айнан шу сабабли cron орқали ишлайдиган оғир вазифалар браузер орқали очилган саҳифадан анча барқарор ишлайди.

PHP хатоси ва 504 Gateway Timeout фарқи

Узоқ ишлайдиган саҳифада икки хил хато учраши мумкин ва уларни фарқлаш муҳим. Агар лог файлида "Maximum execution time" ёзуви бўлса, скриптни PHP'нинг ўзи тўхтатган. Агар браузерда 504 Gateway Timeout саҳифаси чиқса-ю, PHP логида ҳеч нарса бўлмаса, PHP'нинг олдида турган веб-сервер (масалан Nginx) жавобни кутишдан чарчаган. Nginx'да буни fastcgi_read_timeout ёки proxy_read_timeout созламалари бошқаради ва уларнинг стандарт қиймати 60 сония. PHP-FPM'да эса request_terminate_timeout параметри жараённи мажбуран тўхтатиши мумкин. Умумий хостингда бу сервер созламалари мижоз учун очиқ эмас, шунинг учун max_execution_time ни 300 сонияга оширсангиз ҳам, саҳифа барибир 60 сонияда 504 билан узилиши мумкин.

Чегарани ошириш усуллари

Агар вазифа ҳақиқатан ҳам 30 сониядан бироз кўпроқ вақт талаб қилса, чегарани ошириш оддий ва тўғри ечим. Бунинг бир нечта йўли бор ва улар memory_limit билан бир хил тартибда ишлайди.

Хостинг панелида PHP созламалари бўлимида max_execution_time қийматини ўзгартириш мумкин. ISPmanager панелида бу ҳар бир сайт учун алоҳида қилинади, sayt.uz мижозлари панелга sayt.uz кабинетидаги хостинг саҳифасидан киради. PHP FPM ёки CGI режимида ишласа, сайт папкасидаги .user.ini файли ҳам ишлайди. Фақат Apache модули режимида эса .htaccess га php_value қўшиш мумкин, бошқа режимларда бу қатор 500 хатога олиб келади.

; .user.ini
max_execution_time = 120

Код ичида эса set_time_limit() функцияси ишлатилади. Унинг ўзига хос хусусияти бор: чақирилган пайтдан бошлаб ҳисоблагич нолдан қайта бошланади. Шунинг учун узун сиклнинг ҳар бир қадамида уни чақириш скриптга амалда чексиз вақт беради. Бу қулай кўринади, лекин хато ёзилган сикл ҳам шу тарзда абадий ишлаб қолиши мумкин, шунинг учун бу усулни эҳтиёткорлик билан ишлатинг:

set_time_limit(120);   // shu paytdan boshlab 120 soniya

foreach ($rows as $row) {
    importRow($row);
    set_time_limit(30); // har qator uchun hisoblagich qayta boshlanadi
}

Яна бир боғлиқ параметр max_input_time. У сўров маълумотларини (масалан, юкланаётган файлни) қабул қилиш ва қайта ишлашга ажратилган вақтни чеклайди. Секин интернет орқали катта файл юкланаётганда айнан шу параметр муаммо туғдириши мумкин.

Оғир вазифаларни браузердан олиб чиқиш

Агар вазифа бир неча дақиқа ёки ундан кўп давом этса, уни веб-саҳифа орқали бажариш нотўғри ёндашув. Браузер ёпилиши, интернет узилиши ёки веб-сервер таймаути вазифани ярим йўлда тўхтатиб қўяди ва маълумот қисман ёзилган ҳолатда қолади. Тўғри йўл вазифани cron орқали, буйруқ қаторидан ишга туширишдир. ISPmanager панелида режалаштирилган вазифалар учун алоҳида бўлим бор, у ерда буйруқ ва жадвални кўрсатасиз:

# har kuni soat 03:30 da importni ishga tushirish
30 3 * * * /usr/bin/php /var/www/example_user/data/www/example.uz/cron/import.php >> /var/www/example_user/data/logs/import.log 2>&1

Буйруқдаги PHP йўли ва папка йўли серверга қараб фарқ қилади, айниқса сайт учун бошқа PHP версияси танланган бўлса. Тўғри йўлни панелнинг ўзидан ёки техник ёрдамдан аниқлаб олинг. Натижани лог файлга йўналтириш ҳам муҳим, акс ҳолда вазифа хато билан тугаганини билмай қоласиз.

Ишни бўлакларга бўлиш

Cron имкони бўлмаса ёки вазифа фойдаланувчи тугмани босганда бошланиши керак бўлса, ишни кичик бўлакларга бўлинг. Ҳар бир сўров, масалан, 200 та ёзувни қайта ишлайди, қаерда тўхтаганини базага ёки файлга ёзади ва кейинги сўров шу жойдан давом этади. Браузердаги JavaScript бу сўровларни кетма-кет юбориб, фойдаланувчига жараён фоизини кўрсатиб туриши мумкин. Кўплаб WordPress плагинлари (импорт, захира, расм оптимизацияси) айнан шу усулда ишлайди ва шунинг учун оддий хостингда ҳам катта ҳажм билан ишлай олади.

Мисол: Намангандаги улгуржи савдо компанияси

Намангандаги қурилиш моллари улгуржи савдо компанияси misol.uz сайтидаги нархларни ҳар куни ҳисоб дастуридан экспорт қилинган XML файл орқали янгилайди. Дастлаб менежер админ панелдаги "Импорт" тугмасини босган, 8 минг маҳсулотлик файлнинг ярми янгилангач эса саҳифа хато билан тўхтаган. Натижада сайтдаги нархларнинг ярми янги, ярми эски бўлиб қолган. Дастурчи импорт скриптини CLI'дан ишлайдиган қилиб қайта ёзди, уни ҳар куни эрталаб 06:00 да cron орқали ишга тушадиган қилди ва ҳар 500 маҳсулотдан кейин натижани лог файлга ёзадиган қилди. Энди импорт вақт чегарасига боғлиқ эмас, менежер эса эрталаб лог орқали ҳаммаси тўғри янгиланганини текширади.

Қайси ечимни танлаш керак

Чегарани жуда катта қийматга кўтариш муаммони яширади холос: секин скрипт серверда ресурс эгаллаб туради, бир вақтда бир нечта фойдаланувчи ишга туширса эса сайт умуман секинлашади. Шунинг учун аввал вазифа нима учун секин ишлаётганини (индекссиз сўровлар, кераксиз ташқи чақирувлар) текшириш фойдали.

Ўхшаш мақолалар

🥟 Bun runtime: Node.js ўрнига ишлатиш мумкинми ва серверда қандай ишга туширилади 📦 Telegram Bot API локал сервер: катта файллар билан ишлаш учун ўз серверингиз 💻 VS Code Remote SSH: серверда тўғридан-тўғри код ёзиш ва таҳрирлаш 🚦 "Too many connections" хатоси: сабаб ва ечим
🌐 Тил
🇺🇿 O'zbek 🇺🇿 Ўзбек ✓ 🇷🇺 Русский 🇬🇧 English