Warning: set_time_limit() has been disabled for security reasons in

S tímto varováním se nejčastěji setkáte při aktualizaci anebo instalaci šablony, pluginu anebo jádra WordPress. Nejedná se o chybu (error) ale o varování (warning). Informuje nás, že PHP funkce set_time_limit() je na serveru z bezpečnostních důvodů vypnutá.

Takto vypadá varování při aktualizaci WordPress.

Warning: set_time_limit() has been disabled for security reasons in /data/web/virtuals/123456/virtual/www/domains/domena.tld/wp-admin/includes/class-wp-upgrader.php on line 468

Co dělá funkce set_time_limit() #

Funkce set_time_limit() je velice užitečná a mocná. Umožňuje totiž prodloužit dobu běhu skriptu a to až na hodnotu max_execution_time definovanou v php.ini.

Zjednodušeně řečeno, váš PHP skript může běžet v základním nastavení 30 vteřin (záleží na hostingu). Pokud je tento čas překročen, skript je přerušen chybou:

Fatal error: Maximum execution time of 30 second exceeded in /www/domains/domena.tld/mujskript.php

Pro vygenerování webové stránky je to více než dost. Ale pokud potřebujete například zpracovat větší množství dat, vygenerovat report anebo provést stáhnout objemnější soubor, tak 30 vteřin nemusí stačit. A právě proto si pro specifický skript můžete prodloužit dobu jeho běhu až na hodnotu max_execution_time. Tu má nastavený každý webhosting jinak, běžně se setkáte se 60 – 300 vteřinami.

Takto se například prodlouží běh skriptu o 90 vteřin.

set_time_limit(90);

Proč se set_time_limit vypíná #

Zjednodušeně řečeno dlouho běžící skript zabírá PHP vlákno procesoru. Pokud skript běží 90 vteřin, tak tento výkon nemůže být použitý na něco jiného. Třeba vygenerování 450 webových stránek, kterým stačí 0,2 vteřiny.

Pár desítek dlouho běžících skriptů si může klidně vyžádat výkon celého fyzického serveru a dokud se tyto skripty neukončí, tak ostatní čekají ve frontě a po čase končí na chybě 503 anebo vypršení spojení.

Funkce set_time_limit má velkou moc, ale také může napáchat hodně škody. Stačí když třeba skript, který generuje sitemap anebo čistí cache objeví nějaký neposedný vyhledávací robot a opakovaně jí volá. Takovéto skripty mohou být také častým cílem velice efektivního DoS útoku.

Nejčastěji vám tedy hosting vypne funkci set_time_limit(), pokud máte nějaký problémový skript, který by mohl ohrozit ostatní zákazníky. Což je trochu paradox, protože právě set_time_limit() se dá použít i obráceně a u problémových skriptů pro jistotu zkrátit jejich životnost, pokud by v nich někdo našel díru.

Vypnutá set_time_limit a WordPress #

WordPress volá funkci set_time_limit při instalaci a aktualizaci šablon, pluginů a jádra. Ve verzi WordPress 5.4.1 do má na starosti soubory: class-wp-upgrader.php funkce install_package řádek 468

set_time_limit( 300 );

Obecně WordPress nastavuje maximální běh doby skriptu na 300 vteřin z preventivních důvodů. Ve skutečnosti tolik času na většině sdílených webhostingů ani nemá k dispozici. Pevné limity max_execution_time bývají o dost přísnější. U českých webhostingů není výjimkou maximum 90 vteřin.

Stačí to WordPress?

Záleží na rychlosti fyzických serverů (procesor, disky), zdali nedojde k problémům s připojením anebo dalším komplikacím. Velká aktualizaci WordPress může zabrat 30 – 50 vteřin. Některé větší pluginy anebo šablony mohou zabrat podobnou dobu.

Pokud tedy máte k dispozici pro běh skriptu alespoň 60 vteřin nemělo by docházet k problémům. Naopak 30 a méně vteřin už způsobuje komplikace na pomalejších serverech.

Maximální dobu běhu skriptu, kterou neupravuje set_time_limit, zjistíte pomocí funkce phpinfo(), která vám ukáže i konfiguraci webserveru. Ve WordPress najdete i pod NástrojeStav webu, záložka informace, server – hodnota PHP time limit.

Je li zakázaná funkce set_time_limit() na vašem webhostingu a zároveň je maximální doba běhu skriptu 30 a méně vteřin, je opravdu reálné že při aktualizaci můžete narazit na problémy.

Samozřejmě i toto se dá řešit. Místo automatiky lze provádět aktualizace a instalace manuálně. Přes FTP nahrajete anebo přehrajete, co potřebujete nejnovější verzí. V administraci pak jen případně odkliknete aktualizaci databáze. Toto ušetří nějaký čas a do limitu 30 vteřin se vejdete.

Otázkou ale je, zdali nebude lepší vysvětlit svému provozovateli webhostingu, že váš WordPress prostě potřebujte pro pravidelné aktualizace a další údržbu funkci set_time_limit() mít puštěnou, tak jak je ve světě zcela běžné.