15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало
21.10.2024

Как да поправите грешката max_execution_time в WordPress

Грешката max_execution_time в WordPress възниква, когато PHP скрипт надхвърли максималната продължителност на изпълнение, конфигурирана на ниво сървър. PHP прекратява скрипта и връща фатална грешка, която WordPress показва като бял екран, известие за изтекло време или изрично съобщение "Maximum execution time exceeded".

По подразбиране повечето среди за споделен хостинг налагат ограничение от 30 секунди. Операции като импортиране на WooCommerce продуктов CSV, изпълнение на пълно архивиране на сайта или инсталиране на голям пакет от плъгини лесно могат да надхвърлят тази граница. Увеличаването на ограничението — чрез php.ini, .htaccess, wp-config.php или слоя на WordPress плъгини — разрешава грешката, без да компрометира стабилността на сървъра, когато се извършва правилно.

Разбиране защо съществува ограничението и кога се превръща в проблем

Директивата max_execution_time на PHP е механизъм за защита на ресурсите, а не произволно ограничение. Тя предотвратява монополизирането на CPU времето от неконтролиран скрипт в споделен пул от процеси, което е особено критично при многонаемателна инфраструктура.

Ограничението се превръща в реална пречка в следните сценарии:

  • Големи импорти или експорти на бази данни чрез phpMyAdmin или WP-CLI, обработващи хиляди редове
  • Инсталации на плъгини или теми, разархивиращи архиви над 50 MB
  • Масови операции в WooCommerce — актуализации на цени, синхронизации на инвентар, експорти на поръчки
  • Пълни миграции на сайтове с инструменти като Duplicator или All-in-One WP Migration
  • Планирани cron задачи, агрегиращи данни от външни API
  • Плъгини за оптимизация на изображения, обработващи стотици неоптимизирани качвания в един пакет

Важен нюанс, пропускан от повечето ръководства: max_execution_time измерва CPU времето, консумирано от PHP процеса, а не реалното астрономическо време. На силно натоварен сървър скрипт може да работи 90 реални секунди, докато консумира само 28 секунди CPU време и никога да не задейства ограничението. Обратно, CPU-интензивен цикъл достига ограничението по-бързо от очакваното. Това разграничение е важно при диагностициране на периодични изтичания на времето.

Как да проверите текущата стойност на max_execution_time

Преди да промените каквото и да е, потвърдете активното ограничение. Създайте временен файл в корена на WordPress — никога не го оставяйте публично достъпен след тестването:

<?php
phpinfo();

Качете го като phpinfo-test.php, посетете https://yourdomain.com/phpinfo-test.php и потърсете max_execution_time в резултата. Изтрийте файла веднага след проверката.

Алтернативно, използвайте WP-CLI от SSH:

wp eval 'echo ini_get("max_execution_time");'

Това връща стойността, активна за WordPress заявки, която може да се различава от глобалния php.ini на сървъра, ако вече е налице замяна за конкретна директория.

Метод 1: Редактиране на файла php.ini (Най-надежден)

Модифицирането на php.ini е най-авторитетният метод, тъй като задава директивата на ниво PHP интерпретатор, без да замества нищо и без да бъде заместен от нищо под него в йерархията на конфигурацията — освен ако по-късно извикване на ini_set() не го надмине по време на изпълнение.

Стъпка 1: Намерете правилния файл php.ini

Тук повечето администратори допускат грешка. PHP може да зарежда множество .ini файлове в зависимост от използвания SAPI (Server API):

  • CLI SAPI (/etc/php/8.x/cli/php.ini) — използван от WP-CLI и cron задачи
  • FPM SAPI (/etc/php/8.x/fpm/php.ini) — използван от Nginx + PHP-FPM стекове
  • Apache mod_php (/etc/php/8.x/apache2/php.ini) — използван от Apache с PHP модула

Редактирането на CLI php.ini ще поправи изтичанията на времето при WP-CLI, но няма да засегне заявките, задействани от браузъра. Винаги идентифицирайте правилния SAPI първо:

php -i | grep "Loaded Configuration File"

За уеб заявки проверете резултата от phpinfo() под Loaded Configuration File.

Стъпка 2: Редактирайте или създайте php.ini в уеб корена

При споделен хостинг, където нямате root достъп, можете да поставите потребителско ниво php.ini в основната директория на вашия сайт (public_html). Достъпете го чрез cPanel File Manager, FTP или SSH:

nano ~/public_html/php.ini

Добавете или актуализирайте директивата:

max_execution_time = 300

300 секунди (5 минути) е достатъчно за повечето операции. За изключително големи миграции, обмислете временно 600 секунди, след което върнете обратно, след като задачата приключи.

Стъпка 3: Проверете дали промяната е влязла в сила

След запазване, изпълнете отново проверката phpinfo() или WP-CLI командата от по-рано. Ако стойността не се е променила, вашият хост може да налага твърдо ограничение чрез max_execution_time в php.ini на ниво сървър, което надминава вашия потребителски файл. В такъв случай преминете към Метод 4.

Стъпка 4: Рестартирайте PHP-FPM (VPS и Dedicated сървъри)

На VPS или dedicated сървър, където контролирате средата, е необходимо рестартиране на PHP-FPM, за да се разпространи промяната към уеб заявките:

sudo systemctl restart php8.2-fpm

Заменете php8.2-fpm с вашата инсталирана версия на PHP. Apache с mod_php изисква вместо това презареждане на Apache:

sudo systemctl reload apache2

Метод 2: Редактиране на файла .htaccess (само за Apache)

Методът .htaccess работи изключително на Apache сървъри, където AllowOverride позволява PHP конфигурационни директиви. Той не работи на Nginx, LiteSpeed с определени конфигурации или при стек, където PHP работи като FastCGI/FPM с AllowOverride None.

Стъпка 1: Разкрийте и достъпете файла .htaccess

Файлът .htaccess е скрит по подразбиране. В cPanel File Manager кликнете Settings в горния десен ъгъл и активирайте Show Hidden Files (dotfiles). Файлът се намира в public_html.

Чрез SSH:

nano ~/public_html/.htaccess

Стъпка 2: Добавете PHP директивата

Вмъкнете следния ред. Позицията е важна — поставете го извън всеки <IfModule> блок, за да се прилага глобално:

php_value max_execution_time 300

Ако вашият сървър работи с PHP-FPM (разпознаваем по PHP/x.x.x (fpm-fcgi) в phpinfo()), тази директива ще причини 500 Internal Server Error, тъй като php_value не е валидна в този контекст. Използвайте php_admin_value само ако хостът изрично го позволява, или преминете към Метод 1.

Стъпка 3: Тествайте за 500 грешки

След запазване, незабавно заредете началната си страница. Грешка 500 означава, че директивата е несъвместима с конфигурацията на вашия сървър. Премахнете реда и използвайте алтернативен метод.

Метод 3: Редактиране на wp-config.php с set_time_limit()

Функцията set_time_limit() нулира таймера за изпълнение от момента на извикването й. Това е извикване по време на изпълнение на PHP, а не конфигурационна директива, което означава, че работи независимо от това дали сървърът позволява замени чрез php.ini или .htaccess — стига списъкът disable_functions на PHP да не я включва.

Стъпка 1: Намерете wp-config.php

Файлът се намира в корена на WordPress инсталацията, едно ниво над public_html при някои сървърни конфигурации, или директно в него при други.

find ~/public_html -maxdepth 2 -name "wp-config.php"

Стъпка 2: Добавете директивата

Отворете wp-config.php и добавете следния ред преди коментара /* That's all, stop editing! Happy publishing. */:

set_time_limit(300);

Извикването на set_time_limit(0) деактивира ограничението изцяло за тази заявка. Използвайте това само като временна диагностична мярка — никога в продукция — тъй като премахва предпазната мрежа срещу безкрайни цикли.

Важна уговорка: set_time_limit() засяга само текущото изпълнение на скрипта. Не променя конфигурацията на PHP за целия сървър. Ако плъгин вътрешно стартира подпроцес или прави блокираща HTTP заявка, този подпроцес не е обхванат от това извикване.

Метод 4: Използване на WordPress плъгин

За потребители, предпочитащи да не редактират сървърни файлове директно, няколко плъгина излагат PHP конфигурационни стойности чрез административния интерфейс на WordPress. Този подход е подходящ за нетехнически собственици на сайтове при управляван хостинг.

Препоръчани опции:

  • WP Maximum Execution Time Exceeded — специално насочен към тази грешка и опитва множество методи за замяна
  • PHP Settings — предоставя изглед на таблото с активни PHP директиви и позволява безопасни замени там, където хостът го позволява

За инсталиране: навигирайте до Plugins > Add New в таблото на WordPress, потърсете името на плъгина, инсталирайте и активирайте. Следвайте страницата с настройки на плъгина, за да зададете желаното от вас време за изпълнение.

Ограничение: Плъгините могат да извикват само set_time_limit() или ini_set() по време на изпълнение. Ако хостът е заключил max_execution_time чрез ограничения на open_basedir или твърдо кодирана сървърна конфигурация, плъгинът безшумно ще се провали при увеличаването на ограничението. Винаги проверявайте промяната чрез phpinfo() след активирането.

Метод 5: Свържете се с вашия хостинг доставчик

Ако нито един от горните методи не доведе до потвърдена промяна в резултата от phpinfo(), ограничението се налага на ниво сървър от вашия хост. Това е обичайно при начални планове за споделен хостинг, където доставчикът задава твърд таван за защита на споделените ресурси.

При свързване с поддръжката, предоставете:

  • Точното съобщение за грешка и действието в WordPress, което го задейства
  • Текущата стойност на max_execution_time от phpinfo()
  • Стойността, от която се нуждаете (напр. 300 секунди) и причината (напр. голям WooCommerce импорт)

Реномираните хостове или ще коригират ограничението за вашия акаунт, или ще ви насочат към опция в контролния панел (като PHP селектор в cPanel), където можете да го конфигурирате сами.

Сравнение на всичките пет метода

МетодИзисква достъп до сървъраРаботи на NginxРаботи при споделен хостингПостоянствоНиво на риск
`php.ini` (на ниво сървър)Root / sudoДаЗависи от хостаПостоянноНисък
`php.ini` (потребителско ниво в уеб корена)FTP / cPanelЗависи от хостаЧесто даПостоянноНисък
`.htaccess`FTP / cPanelНе (само Apache)Често даПостоянноСреден (риск от 500)
`wp-config.php` (`set_time_limit`)FTP / cPanelДаДаЗа заявкаНисък
WordPress плъгинСамо WP администрацияДаДаЗа заявкаНисък
Свържете се с хостинг доставчикаНямаДаДаПостоянноНикакъв

Диагностициране на постоянни изтичания на времето след увеличаване на ограничението

Ако сте потвърдили, че новото ограничение е активно в phpinfo(), но грешката продължава, тесното място вероятно не е max_execution_time. Обмислете тези алтернативни причини:

FastCGI или Nginx директиви за изтичане на времето — Nginx има собствена директива fastcgi_read_timeout, отделна от PHP:

fastcgi_read_timeout 300;

Това трябва да бъде зададено в сървърния блок на Nginx и изисква презареждане на Nginx.

Директивата TimeOut на Apache — собственото изтичане на връзката на Apache може да прекрати заявка преди достигане на ограничението на PHP:

TimeOut 300

PHP-FPM request_terminate_timeout — В конфигурацията на PHP-FPM пула (/etc/php/8.x/fpm/pool.d/www.conf), тази директива независимо прекратява работни процеси:

request_terminate_timeout = 300

MySQL wait_timeout и interactive_timeout — Дълго изпълняващите се заявки към базата данни могат да причинят прекъсване на MySQL връзката по средата на изпълнението, което PHP показва като грешка на скрипта, а не като грешка на базата данни. Проверете с:

SHOW VARIABLES LIKE '%timeout%';

Изтичания на времето на ниво WooCommerce или плъгин — Някои плъгини имплементират собствена вътрешна логика за изтичане на времето, използвайки set_time_limit() на PHP с по-ниска стойност, което нулира брояча и може да замени вашата конфигурация.

Съображения за производителност и най-добри практики

Увеличаването на max_execution_time е целенасочено решение, а не постоянно архитектурно решение. Ако конкретна операция рутинно надхвърля 30–60 секунди, основният процес трябва да бъде оптимизиран или преструктуриран:

  • Пакетна обработка: Разбийте големите импорти на по-малки части, използвайки AJAX-базирано разделяне на части (както WP All Import прави нативно), вместо да обработвате всичко в една HTTP заявка
  • Фонова обработка: Използвайте WP-Cron или правилна опашка от задачи (Action Scheduler, използван от WooCommerce), за да преместите дълго изпълняващата се работа извън жизнения цикъл на уеб заявката
  • WP-CLI за масови операции: CLI изпълнението не е обект на изтичания на времето на уеб сървъра и е правилният инструмент за импорти на бази данни, операции за търсене и замяна и масова обработка на медии
  • Оптимизиране на бавни заявки: Използвайте плъгина Query Monitor за идентифициране на заявки към базата данни, консумиращи непропорционално много време за изпълнение
  • Надграждане на хостинг плана: Ако вашето натоварване постоянно изисква удължено време за изпълнение, VPS с cPanel ви дава пълен контрол върху PHP конфигурацията и dedicated ресурси, които не се конкурират с други наематели

За изчислително интензивни натоварвания като AI-базирани препоръки за продукти или мащабни тръбопроводи за обработка на изображения, GPU хостингът прехвърля интензивното изчисление изцяло извън PHP слоя.

Практически контролен списък за вземане на решения

Използвайте този контролен списък преди и след прилагане на всяко решение:

  • Потвърдете текущата стойност на max_execution_time чрез phpinfo() или WP-CLI преди да правите промени
  • Идентифицирайте вашия сървърен стек (Apache + mod_php, Apache + FPM, Nginx + FPM) преди да изберете метод
  • Прилагайте само един метод наведнъж — едновременното натрупване на промени в php.ini, .htaccess и wp-config.php прави отстраняването на грешки невъзможно
  • След прилагане на промяна, проверете отново активната стойност в phpinfo() — не приемайте, че промяната е проработила
  • Тествайте, като възпроизведете оригиналното неуспешно действие, а не само като заредите началната страница
  • Ако грешката е разрешена, обмислете дали основната операция може да бъде оптимизирана да работи в рамките на оригиналното ограничение
  • Задайте напомняне в календара за връщане на всички временни увеличения на ограничението (напр. set_time_limit(0)) след приключване на еднократната задача
  • При споделен хостинг, документирайте какво хостът е потвърдил като максимално допустима стойност за вашия план
  • Ако изтичанията на времето продължават след потвърждаване, че PHP ограничението е увеличено, одитирайте независимо Nginx fastcgi_read_timeout, Apache TimeOut и PHP-FPM request_terminate_timeout

ЧЗВ

Каква е най-безопасната стойност за задаване на max_execution_time в WordPress?

300 секунди (5 минути) покриват огромното мнозинство от ресурсоемките WordPress операции, включително големи инсталации на плъгини, WooCommerce импорти и актуализации на теми. Стойности над 600 секунди трябва да се третират като временни и да се върнат обратно след приключване на конкретната задача.

Защо промяната на max_execution_time не се появява в phpinfo() след редактиране на php.ini?

Най-вероятно редактирате грешния php.ini файл. PHP зарежда различни конфигурационни файлове за CLI, Apache mod_php и PHP-FPM. Изпълнете php -i | grep "Loaded Configuration File" за CLI и проверете реда Loaded Configuration File в достъпна от браузъра phpinfo() страница, за да идентифицирате правилния файл за уеб заявки.

Засяга ли увеличаването на max_execution_time всички потребители на моя сървър?

На споделен сървър редактирането на потребителско ниво php.ini в уеб корена засяга само вашия акаунт. Редактирането на глобалния сървърен php.ini (което изисква root достъп) засяга всички PHP процеси на този сървър. На dedicated сървър вие контролирате глобалната конфигурация и носите пълна отговорност за нейното въздействие.

Ще работи ли методът с .htaccess на Nginx сървър?

Не. Файлът .htaccess е специфичен за Apache механизъм. Nginx не обработва .htaccess файлове. При стекове с Nginx + PHP-FPM трябва да редактирате конфигурацията на PHP-FPM пула или php.ini на ниво сървър, и двете от които изискват SSH достъп.

Може ли WordPress плъгин постоянно да увеличи max_execution_time?

Не. Плъгините се изпълняват в рамките на PHP средата за изпълнение и могат да извикват само set_time_limit() или ini_set(), които засягат само текущата заявка. Те не могат да записват в php.ini или да запазват конфигурационни промени между заявките. За постоянно увеличение трябва да модифицирате php.ini, .htaccess или конфигурационен файл на PHP-FPM пул на ниво сървър.

15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало