Limity webhostingu se na stránce s tarify objevují jen zřídka: „neomezený“ se obvykle týká přenosu dat, počtu webů nebo e-mailových schránek, ne prostředků serveru, a stránky nápovědy velkých poskytovatelů uvádějí limit souborů (inodů), počet souběžných PHP procesů, podíl CPU, paměť, připojení k databázi a e-maily za hodinu. Web obvykle jako první narazí na souběžné PHP procesy a CPU: návštěvníci vidí pomalé načítání a potom chybu 503, 504 nebo 508 „Resource Limit Is Reached“. Níže najdete zveřejněné limity pěti známých poskytovatelů, test v testovacím prostředí a skript, který vaše vlastní limity ukáže přímo z PHP.
Jak jsme to ověřovali
10. listopadu 2026 jsme prošli zveřejněné stránky s limity a pravidly používání u Hostinger, Bluehost, SiteGround, Namecheap a HostGator (odkazy v tabulce). Týž den jsme v testovacím prostředí (kontejner Ubuntu 24.04.5, 2 vCPU, nginx 1.24.0, PHP-FPM 8.3.6, MariaDB 10.11.14) nasimulovali typické limity: pool PHP-FPM s pm.max_children = 4, časové limity, limity nahrávání, MAX_USER_CONNECTIONS 3 pro databázového uživatele a omezení CPU a paměti přes cgroups, tedy stejný mechanismus jádra, na kterém stojí limity LVE v CloudLinuxu (samotný CloudLinux v testu neběžel). Jde o výsledky z testovacího prostředí, ne o hodnoty serverů RichHost.
Co ve skutečnosti říkají podmínky „neomezených“ tarifů
„Neomezený“ znamená to, co poskytovatel neměří: přenos dat, počet domén, někdy místo na disku. Technické prostředky jsou vždy omezené, protože jeden server sdílejí stovky účtů; rozdíl je jen v tom, zda poskytovatel čísla zveřejní. Tohle uvádějí oficiální stránky nápovědy:
| Poskytovatel, tarify | Soubory (inody) | Souběžné PHP procesy | CPU | E-maily ze serveru | Databáze |
|---|---|---|---|---|---|
| Hostinger: Single / Premium / Business (prodáván jako Unlimited) | 200 000 / 400 000 / 600 000 | 20 / 40 / 60 PHP workers | 1 / 1 / 2 jádra | 10 za minutu, nejvýše 100 za den | 3 GB; 25 / 50 / 75 připojení; dotazy až 60 / 60 / 120 s |
| Bluehost: sdílený hosting | nejvýše 200 000, orientační hranice 50 000 | nezveřejněno | omezeno, bez čísel | od 200 za hodinu (až 1 000 ve vyšších úrovních) | 5 GB na databázi, celkem 10 GB |
| SiteGround: StartUp / GrowBig / GoGeek | 200 000 / 400 000 / 600 000 | nezveřejněno | 1 000 / 2 000 / 4 000 CPU sekund za hodinu | nezveřejněno | až 1 000 MB na databázi |
| Namecheap: Stellar / Stellar Plus / Stellar Business | 300 000 / 300 000 / 600 000 | 20 / 30 / 40 entry processes | 50 / 50 / 100 % jádra | 50 / 200 / 10 000 za hodinu na doménu | nezveřejněno |
| HostGator: sdílený hosting | 1 000 000 souborů | 25 souběžných procesů | 25 % CPU | 500 za hodinu | 5 GB; 25 připojení |
Detaily, které se snadno přehlédnou. Stránka Bluehostu o inodech uvádí, že nad 200 000 souborů spadá účet pod oddíl pravidel o nadměrném využívání prostředků a nad 1 000 000 hrozí pozastavení. Namecheap vyřazuje z automatických záloh účty s více než 200 000 inody (kromě Stellar Business). SiteGround doporučuje spouštět stejnou úlohu cron nejvýše jednou za 30 minut a omezuje jeden proces na 768 MB paměti. Hostinger navíc uvádí PHP max_execution_time 360 s a maximální dobu dotazu do databáze. Bývalý A2 Hosting (dnes hosting.com) už na stránce tarifů „neomezený“ neslibuje a žádná čísla limitů tam nezveřejňuje.
CloudLinux, na kterém běží velká část serverů sdíleného hostingu, používá podle dokumentace CloudLinuxu tyto výchozí hodnoty: jedno jádro CPU (SPEED 100 %), 1024 MB fyzické paměti (PMEM), 20 entry processes (EP), celkem 100 procesů (NPROC), 1024 KB/s diskových operací. Každý poskytovatel může kteroukoli z nich změnit.
Které limity se projeví první a jak to vypadá
Některé limity skončí chybou okamžitě, jiné web jen zpomalí a další rozbijí nějakou funkci, aniž by se na obrazovce objevila chyba. Tabulka spojuje naše testy s dokumentací CloudLinuxu:
| Limit | Co uvidí návštěvník | Kde hledat stopu |
|---|---|---|
| Souběžné PHP procesy (EP, PHP workers, pm.max_children) | Fronta, potom 504; na CloudLinuxu 508 Resource Limit Is Reached | Graf entry processes v panelu; řádek „server reached max_children setting“ v logu PHP-FPM |
| CPU (SPEED, CPU sekundy) | Web je prostě pomalejší, bez chyby | Graf CPU v panelu, rostoucí doba odezvy |
| Paměť účtu (PMEM) | 500, 502 nebo 503, v logu PHP nic | Proces ukončený signálem SIGKILL, graf paměti |
| memory_limit v PHP | 500 nebo stránka WordPressu „kritická chyba“ | error_log: Allowed memory size exhausted |
| max_execution_time | 500 po několika sekundách práce | error_log: Maximum execution time exceeded |
| Časový limit proxy nebo PHP-FPM | 504 Gateway Time-out nebo 502 Bad Gateway | error.log webového serveru |
| upload_max_filesize, post_max_size | Stránka vrátí 200, ale soubor chybí; nebo 413 | Kód chyby 1 v $_FILES, varování k POST Content-Length |
| Inody | Nelze vytvářet nové soubory: cache, relace, náhledy, pošta | No space left on device, přestože je na disku volné místo |
| MySQL max_user_connections | Error establishing a database connection | ERROR 1226 v logu |
Podrobné rozbory jednotlivých případů: chyba 508 Resource Limit Is Reached, jak zvýšit memory_limit a limit inodů na hostingu.
Test: co dostane pátý návštěvník, když jsou k dispozici čtyři PHP procesy
Nastavili jsme pool PHP-FPM se čtyřmi procesy a stránku, která 5 sekund čeká, podobně jako stránka čekající na pomalé externí API nebo na těžký databázový dotaz. Pak jsme poslali požadavky současně:
- 5 požadavků: první čtyři odpověděly za 5,0 s, pátý za 9,8 s. Žádná chyba: požadavek prostě čekal ve frontě na volný proces. V logu PHP-FPM se objevil řádek
server reached max_children setting (4), consider raising it. - 12 požadavků s časovým limitem proxy 10 s: požadavky 1 až 4 dostaly 200 za 5,0 s, 5 až 8 dostaly 200 za 9,8 s, 9 až 12 dostaly 504 Gateway Time-out přesně po 10 s.
- Duchové po 504: hned po této dávce jsme otevřeli nejlehčí stránku. Načítala se 3,75 s místo okamžité odpovědi, protože všechny čtyři procesy pořád zpracovávaly požadavky, jejichž návštěvníci už dostali 504.
Ponaučení: limit souběžnosti se netýká počtu návštěvníků, ale počtu pomalých požadavků. Čtyři procesy obslouží desítky lidí, pokud se stránka vygeneruje za 0,1 s, a zadrhnou se už u pátého, pokud každá stránka čeká 5 sekund na externí službu. Na CloudLinuxu návštěvník, který narazí na limit EP, dostane 508 okamžitě, bez fronty. Jak bezpečně najít vlastní strop, popisuje náš návod na zátěžový test webu.
CPU: ne chyba, ale zpomalení
Stejnou stránku s pevným objemem výpočtů jsme spustili pod limitem CPU nastaveným přes cgroup. Všech 120 požadavků vrátilo 200; měnil se jen čas:

Čtyři souběžné požadavky sdílejí jednu kvótu, takže při 25 % jádra stránka, která bez limitu odpovídala za 0,35 s, potřebovala v průměru 3,83 s. Přesně tak vypadá situace „web je pomalý, ale panel tvrdí, že vše funguje“.
Časové limity: tři různé hodiny
max_execution_timena Linuxu počítá čas CPU skriptu. Výpočetní smyčka s limitem 3 s skončila chybou 500 aMaximum execution time of 3 seconds exceeded, zatímco stránka, která při stejném limitu 6 s čekala (sleep), vrátila 200. Čekání na API nebo databázi se nepočítá.request_terminate_timeoutv PHP-FPM počítá skutečně uplynulý čas: výpočet i čekání byly ukončeny po 20 s a návštěvník dostal 502.- Časový limit proxy (
fastcgi_read_timeoutv nginx) vrátil 504 po 10 s, přestože PHP dál běželo.
Paměť, nahrávání a databáze
- Alokace 200 MB při
memory_limit = 128Mskončila chybou 500 a záznamem v logu PHP. Když jsme omezili paměť celého poolu na 256 MB (jako PMEM v LVE) a zvýšili memory_limit na 1024M, jádro proces ukončilo: 502 a v logu PHP ani řádek. - Soubor 3 MB při
upload_max_filesize = 2M: stránka vrátila 200, ale soubor nikdy nedorazil (kód chyby 1). Soubor 9 MB připost_max_size = 8M: zmizel celý formulář včetně textových polí. Stejný soubor 3 MB přes nginx s výchozím nastavením: 413 Request Entity Too Large. - Databázový uživatel s
MAX_USER_CONNECTIONS 3: z pěti souběžných požadavků dva dostaly za 0,002 sERROR 1226 ... has exceeded the 'max_user_connections' resource. WordPress v takovém případě zobrazí „Error establishing a database connection“. Limit doby dotazu (max_statement_time = 2) přerušil těžký dotaz přesně po 2 s chybou ERROR 1969.
Jak ověřit své limity: skript limits.php
Hostingový panel neukáže všechno. Skript níže jsme v testovacím prostředí vyzkoušeli ve dvou režimech: s běžným poolem a s poolem, kde jsou zakázané shellové funkce a zapnutý open_basedir, jako u mnoha sdílených hostingů. Vypíše skutečně platné hodnoty PHP, největší možný upload, podíl CPU, který skript během 1 sekundy opravdu dostane, limity procesů z /proc a cgroup (pokud jsou čitelné), ulimit -a (pokud je shell povolen), počet souborů v domovském adresáři a limity databáze včetně MAX_USER_CONNECTIONS z GRANT.
- Změňte
KEYna vlastní dlouhý řetězec. - Nahrajte soubor do kořenového adresáře webu vedle wp-config.php (u jiného CMS vyplňte pole
$db). - Otevřete
https://your-site/limits.php?key=YOUR_KEY. Bez klíče skript vrací 404. - Výstup si uložte a soubor ihned smažte.
<?php
// limits.php: shows the limits that really apply to this hosting account.
// 1) set your own KEY, 2) upload next to wp-config.php (or fill DB_* below),
// 3) open https://your-site/limits.php?key=YOUR_KEY, 4) DELETE the file afterwards.
const KEY = 'change-me';
$db = ['host' => '', 'user' => '', 'pass' => '', 'name' => '']; // empty = read wp-config.php
if (KEY === 'change-me' || !hash_equals(KEY, (string)($_GET['key'] ?? ''))) { http_response_code(404); exit; }
header('Content-Type: text/plain; charset=utf-8');
function row($k, $v) { printf("%-28s %s\n", $k, is_bool($v) ? ($v ? 'yes' : 'no') : $v); }
function head($t) { echo "\n== $t\n"; }
function bytes($v) { $n = (float)$v; $u = strtolower(substr(trim($v), -1)); return $u === 'g' ? $n * 1073741824 : ($u === 'm' ? $n * 1048576 : ($u === 'k' ? $n * 1024 : $n)); }
function readable($f) { return @is_readable($f) ? trim((string)@file_get_contents($f)) : null; }
head('PHP');
row('version / SAPI', PHP_VERSION . ' / ' . PHP_SAPI);
foreach (['memory_limit', 'max_execution_time', 'max_input_time', 'upload_max_filesize', 'post_max_size',
'max_file_uploads', 'max_input_vars', 'default_socket_timeout', 'open_basedir', 'disable_functions',
'opcache.enable', 'opcache.memory_consumption', 'sendmail_path'] as $k) {
$v = ini_get($k);
row($k, $v === false ? '(not available)' : ($v === '' ? '(empty)' : $v));
}
$up = min(bytes(ini_get('upload_max_filesize')), bytes(ini_get('post_max_size')) ?: PHP_INT_MAX);
row('largest upload via PHP', round($up / 1048576, 1) . ' MB (web server may allow less)');
head('This process');
$u = function_exists('posix_getpwuid') ? (posix_getpwuid(posix_geteuid())['name'] ?? '?') : get_current_user();
row('pid / user', getmypid() . ' / ' . $u);
$t0 = microtime(true); $r0 = getrusage(); $n = 0;
while (microtime(true) - $t0 < 1.0) { $n++; } // 1 s of pure CPU work
$r1 = getrusage(); $wall = microtime(true) - $t0;
$cpu = ($r1['ru_utime.tv_sec'] + $r1['ru_utime.tv_usec'] / 1e6 + $r1['ru_stime.tv_sec'] + $r1['ru_stime.tv_usec'] / 1e6)
- ($r0['ru_utime.tv_sec'] + $r0['ru_utime.tv_usec'] / 1e6 + $r0['ru_stime.tv_sec'] + $r0['ru_stime.tv_usec'] / 1e6);
row('CPU test 1 s', sprintf('cpu %.2f s of wall %.2f s = %d%% (loops %s)', $cpu, $wall, 100 * $cpu / $wall, number_format($n)));
row('peak memory', round(memory_get_peak_usage(true) / 1048576, 1) . ' MB');
row('max RSS (getrusage)', round($r1['ru_maxrss'] / 1024, 1) . ' MB');
head('OS limits (/proc, cgroup)');
if ($l = readable('/proc/self/limits')) {
foreach (explode("\n", $l) as $line) {
if (preg_match('/^(Max cpu time|Max processes|Max open files|Max address space)\s+(\S+)\s+(\S+)/', $line, $m)) row($m[1], "soft $m[2], hard $m[3]");
}
} else { row('/proc/self/limits', 'not readable (open_basedir?)'); }
foreach (explode("\n", (string)readable('/proc/self/cgroup')) as $line) { // own cgroup (v1 and v2)
$p = explode(':', $line, 3); if (count($p) < 3) continue;
$files = $p[1] === '' ? ['memory.max', 'cpu.max', 'pids.max'] : ['memory' => ['memory.limit_in_bytes'],
'cpu' => ['cpu.cfs_quota_us', 'cpu.cfs_period_us'], 'pids' => ['pids.max']][$p[1]] ?? [];
foreach ($files as $f) {
$path = '/sys/fs/cgroup' . ($p[1] === '' ? '' : '/' . $p[1]) . rtrim($p[2], '/') . '/' . $f;
if (($v = readable($path)) !== null) row("cgroup $f", $v);
}
}
$fn = 'shell_exec';
if (function_exists($fn) && !in_array($fn, array_map('trim', explode(',', (string)ini_get('disable_functions'))), true)) {
head('ulimit -a (shell)');
echo $fn('ulimit -a 2>&1') ?: "(no output)\n";
} else { row('shell_exec', 'disabled'); }
head('Files (inodes)');
$home = getenv('HOME') ?: dirname(__DIR__);
$base = @is_readable($home) ? $home : __DIR__;
$cnt = 0; $stop = microtime(true) + 15;
try {
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($base, FilesystemIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST, RecursiveIteratorIterator::CATCH_GET_CHILD);
foreach ($it as $x) { $cnt++; if (microtime(true) > $stop) { $cnt .= '+ (stopped after 15 s)'; break; } }
} catch (Throwable $e) { $cnt .= ' (error: ' . $e->getMessage() . ')'; }
row('files+dirs under', "$base: $cnt");
row('disk free (volume)', round(@disk_free_space(__DIR__) / 1073741824, 1) . ' GB (volume, not your quota)');
head('Database');
if ($db['user'] === '' && is_readable(__DIR__ . '/wp-config.php')) {
$c = file_get_contents(__DIR__ . '/wp-config.php');
foreach (['host' => 'DB_HOST', 'user' => 'DB_USER', 'pass' => 'DB_PASSWORD', 'name' => 'DB_NAME'] as $k => $c2)
if (preg_match("/define\(\s*['\"]{$c2}['\"]\s*,\s*['\"](.*?)['\"]\s*\)/", $c, $m)) $db[$k] = $m[1];
}
if ($db['user'] === '' || !class_exists('mysqli')) { row('database', 'no credentials or no mysqli'); exit; }
mysqli_report(MYSQLI_REPORT_OFF);
$h = $db['host'] ?: 'localhost'; $port = null; $sock = null;
if (strpos($h, ':') !== false) { [$h, $p] = explode(':', $h, 2); is_numeric($p) ? $port = (int)$p : $sock = $p; }
$m = @new mysqli($h, $db['user'], $db['pass'], $db['name'], $port, $sock);
if ($m->connect_errno) { row('connect error', $m->connect_errno . ' ' . $m->connect_error); exit; }
$q = $m->query('SELECT VERSION() v, @@max_connections mc, @@max_user_connections muc, @@wait_timeout wt, @@max_allowed_packet map');
foreach ($q->fetch_assoc() as $k => $v) row(['v' => 'server version', 'mc' => 'max_connections (server)',
'muc' => 'max_user_connections', 'wt' => 'wait_timeout', 'map' => 'max_allowed_packet'][$k], $v);
foreach (['@@max_statement_time' => 'max_statement_time (MariaDB)', '@@max_execution_time' => 'max_execution_time (MySQL, ms)'] as $var => $label)
if ($r = $m->query("SELECT $var")) row($label, $r->fetch_row()[0]);
if ($r = $m->query('SHOW GRANTS FOR CURRENT_USER()')) {
while ($g = $r->fetch_row()) if (preg_match('/WITH (.*)$/', $g[0], $mm)) row('per-user limits (GRANT)', $mm[1]);
}
if ($r = $m->query('SELECT COALESCE(ROUND(SUM(data_length+index_length)/1048576,1),0) FROM information_schema.tables WHERE table_schema = DATABASE()'))
row('this database size', $r->fetch_row()[0] . ' MB');
echo "\nDone. Delete this file now.\n";
V testovacím prostředí s limitem CPU 25 % zněl testovací řádek CPU test 1 s cpu 0.27 s of wall 1.04 s = 26% a níže skript ukázal samotnou kvótu: cgroup cpu.cfs_quota_us 25000. Bez kvóty, ale na vytíženém stroji ukázal test 70 %: nízké procento může způsobit i sousední zátěž, proto čtěte oba řádky společně. Na serverech s CloudLinuxem obvykle soubory cgroup z účtu číst nelze; pak se spolehněte na test CPU a grafy v panelu. Jak PHP ověřit nebo přepnout, vysvětluje náš návod verze PHP na hostingu.
Dvě věci skript ukázat neumí: hodinový limit e-mailů (zná ho jen poštovní server poskytovatele) a nejkratší interval cronu. Na obojí se zeptejte podpory; nastavení úloh popisuje náš návod cron úlohy na hostingu.
Když X, udělejte Y
| Když | Udělejte |
|---|---|
| Občas 508 nebo 503 a v logu je max_children nebo limit EP | Najděte pomalé požadavky (slowlog, Query Monitor) a zapněte cache stránek; více procesů bez toho problém jen odloží |
| Web je pomalý bez chyb a graf CPU naráží na strop | Cache stránek, OPcache, odstranění těžkých pluginů; pokud to nestačí, vyšší tarif |
| 504 při importu, exportu nebo záloze | Spouštějte takové úlohy po dávkách přes cron nebo WP-CLI, ne z prohlížeče |
| 500 a „Allowed memory size exhausted“ | Zvyšte memory_limit v rámci tarifu a zjistěte, co paměť spotřebovává |
| 502 nebo 503 a v logu PHP nic není | Podezřívejte limit paměti účtu a kontaktujte podporu s přesným časem chyby |
| Soubor se nenahraje a žádná chyba se neobjeví | Porovnejte upload_max_filesize, post_max_size a limit webového serveru: platí ten nejmenší |
| „Error establishing a database connection“ pod zátěží | Zkontrolujte MAX_USER_CONNECTIONS, odstraňte dlouhé dotazy a trvalá připojení |
| Nové soubory nelze vytvořit, přestože je na disku místo | Spočítejte inody, vyčistěte cache, relace a staré zálohy |
Jak to funguje u RichHost
Hostingové tarify RichHost zahrnují neomezený přenos dat a neomezený počet webů, e-mailových schránek a FTP účtů na NVMe discích. Pošta odchází z čistých IP adres, doručování se hlídá a spammeři jsou blokováni, takže hromadné rozesílky je lepší posílat přes specializovanou službu. Přesné limity procesů, paměti a souborů konkrétního tarifu vám sdělí podpora: pracuje od 10:00 do 20:00 kyjevského času a odpovídá zhruba do 30 minut. Skript výše ukáže, co pro váš účet skutečně platí.
Časté otázky
Jaký je rozdíl mezi chybami 503, 504 a 508?
Na CloudLinuxu znamená 508, že účtu došly souběžné procesy. 503 častěji souvisí s pamětí nebo počtem procesů. 504 znamená, že proxy nedostala od PHP včas odpověď.
Můžu limity zvýšit bez změny tarifu?
Hodnoty PHP (memory_limit, max_execution_time, velikost uploadu) lze často změnit v panelu v rámci tarifu. CPU, paměť účtu a limity procesů nastavuje poskytovatel a mění se jen s jiným tarifem.
Je bezpečné nechat limits.php na webu?
Ne. Prozrazuje nastavení serveru a databáze. Spusťte ho s vlastním klíčem, výstup si uložte a soubor smažte.



