Přejít k obsahu
Pošta Kabinet Vybrat tarif

Limity webhostingu: co se projeví první a jak je ověřit

Limity webhostingu: co se projeví první a jak je ověřit

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:

Graf: průměrná doba odezvy při omezení CPU na 100, 50 a 25 procent jednoho jádra
Limit CPU neukáže chybu, jen zpomalí odpovědi

Č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_time na Linuxu počítá čas CPU skriptu. Výpočetní smyčka s limitem 3 s skončila chybou 500 a Maximum 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_timeout v 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_timeout v 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 = 128M skonč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ři post_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 s ERROR 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.

  1. Změňte KEY na vlastní dlouhý řetězec.
  2. Nahrajte soubor do kořenového adresáře webu vedle wp-config.php (u jiného CMS vyplňte pole $db).
  3. Otevřete https://your-site/limits.php?key=YOUR_KEY. Bez klíče skript vrací 404.
  4. 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.

Více k tématu

Všechny články
Chyba 500 Internal Server Error: najděte příčinu v logu a opravte ji
Řešení problémů s hostingem03.04.2026

Chyba 500 Internal Server Error: najděte příčinu v logu a opravte ji

Chyba 500 Internal Server Error: co vidí návštěvník, jaký řádek hledat v chybovém logu a jak odstranit příčinu. Osm příčin jsme nasimulovali…

Záloha webu na hostingu: pravidlo 3-2-1, nástroje a test obnovy
Návody a tutoriály k hostingu28.03.2026

Záloha webu na hostingu: pravidlo 3-2-1, nástroje a test obnovy

Co zálohovat, čím a jak často, proč dump bez single-transaction ztrácí objednávky, jaký kompresor zvolit a jak ověřit, že se ze zálohy…

Web nefunguje? Co dělat v prvních 10 minutách
Řešení problémů s hostingem27.03.2026

Web nefunguje? Co dělat v prvních 10 minutách

Co dělat, když web nefunguje: testovací WordPress jsme rozbili deseti způsoby a sestavili tabulku příznaků, rychlých kontrol a kroků na prvních 10…