Hledáme investora pro realizaci velkoobchodní zakázky. Výnos od 20% za půl roku do 500% ročně.
18.09.2021 12:49
1
Ahoj,

muze mi prosim nekdo poradit, co nejvice ovlivni rychlost uploadu souboru na server? Bavme se o klasickem zpusobu uploadu skrze PHP.

Je to spis RAMka, procesor, nebo oboje dohromady? A na co se mam u vyberu hostingu, pripadne u konfiguraci vlastniho serveru nejvice zamerit?

Dekuji.
18.09.2021 13:32
2
Nastavené limity
18.09.2021 13:49
3
Myslis jako memory_limit treba, nebo i dalsi? Kdyz budu mit vlastni server, muzu si to prece nastavit sam.
18.09.2021 14:00
4
Nastavené limity v PHP nemůžou ovlivnit rychlost nahrávání.

Vzhledem k tomu, ze servery většinou bývají v datacentrech s dostatečnou konektivitou, tak nejpomalejší bývá rychlost připojení uživatele.
Dalsi potenciálni problém je tedy v rychlosti připojení serveru, jestli poskytovatel nemá nějaké omezení pro download na tom serveru.
Když si pak vezmeš, ze u běžného nastavení serveru se při uploadu souborů soubory nejdříve uloží do RAMky a pak až přesouvají na disky, tak co se týče HW je nutné mít dostatek RAM, aby se to na ní všechno vešlo a nezacaly se soubory ukládat do tmp části na disku ( jestli ji máš nastavenou ). Ten přesun na disk už si pak OS řeší sám, neovlivnuje to klientskou stranu. Takže dokud nebudeš mit tolik uploadu najednou/hned za sebou, aby to nestíhal disk, tak by tě neměl omezovat.

Nejhorší na tomhle je většinou ta rychlost připojení klienta k serveru, bohužel ještě porad má většina lidí asymetrickej internet
18.09.2021 17:24
5
Při nahrávání dat přes multipart formulář celý proces probíhá následovně:
1) prohlížeč zabalí nahrávaná data do formátu multipart/form-data a postupně je po tzv. chunkách posílá
2) php dostává nahrávaná data a ukládá si je do in-memory bufferu (je nutné mít nastavený memory_limit vyšší než je velikost nahrávaných dat, tj. všech nahrávaných souborů dohromady)
3) jakmile se skončí nahrávání, php projde data v in-memory buffer, rozdělí je na soubory a ty po 16k blocích postupně ukládá na disk do /tmp složky jeden po druhém, pak buffer uvolní a smaže
4) jakmile všechny soubory uloží, naplní proměnnou $_FILES a začne provádět tvůj script

Co tedy vše ovlivňuje rychlost nahrávání:
- samozřejmě rychlost sítě na straně klienta i serveru, k nahrávání se využívá TCP a data se po chunkách posílají postupně, kromě tedy šířky pásma (100Mb/s) rychlost ovlivňuje i latence (např. běžná 20ms), protože se musí po každém bloku dat čekat na potvrzení. Na straně serveru zase bývá problém se sdílenými sítěmi, většina VPS, ale i malých dedikovaných serverů má sdílené sítě s ostatními účastníky, někdy ve špičkách nemusí být dostatečná kapacita pro všechny, v tomhle vévodí Wedos a na špičky tam narazíš často
- Na stramě serveru dochází nejprve k ukládání dat do paměti a pak na disk, rychlost samotné disku, kde jsou /tmp soubory je kruciálně důležité, na pomalých discích (ať už pomalé ssd, plotnové nebo např. na omezených levných instancí v cloudu) je tohle úzké hrdlo a nejspi často schopný ani jedním běžným serverem obsloužit klienta na 1Gb/s lince, natož více klientů
- Nahrané soubory poté musíš zpravidla hned i z disku přečíst, když je zpracováváš, takže je potřeba počítat u disku kombinovanou zátěž pro zápis/čtení

Chceme-li někdy výrazně zvýšit rychlost nahrávání dat do php, rozhodujeme se často mezi třemi možnostmi:
1) zrychlit zápis a čtení do /tmp, ať už vložením celého /tmp do ramdisku, na hodně rychlé nvme disky nebo ho nasměrovat na rychlé distribuované diskové pole nebo síťový block storage (s3, adls, CIFS atd.), tohle nám často umožňuje na jednom serveru vytěžovat i 10Gb/s linku pro upload souborů
2) nepoužívat multipart/form-data a data nahrávat nikoliv standardním html formulářem, ale posílat jako POST data přes javacript (takhle třeba funguje řada uloz.to a jiných portálů), data totiž v php zůstávají v in-memory proměnných a nedochází k jejich zbytečnému ukládání na disk, poté lze z php je přímo poslat do nějakého síťové uložiště přímo a ušetříš si tím zápis na lokální disk, za mě zpravidla při návrhu přeferované řešení, je totiž levnější
3) odchytíme nahrávání už na proxy serveru, který je sám uloží do efektivního síťového uložiště a do php místo toho pošle jen nějaký placeholder soubor, aby php vědělo kde data jsou

Řešíš-li to pro malý web a tisícovka měsíčně jsou pro tebe obrovské náklady, v tom případě se zaměř právě na rychlost sítě (a jeji agregaci, tj. kolik klientů jí zároveň může využívat, to ti sdělí hosting provider většinou ochotně) a pak na rychlost /tmp disku (vč. počtu operací pro zápis a čtení za vteřinu). Velikost paměti na serveru a velikost /tmp disku je přímo úměrná maximální velikosti nahrávaných dat a počtu souběžných klientů, kteří data právě nahrávají. Takže pro 10 souběžných nahrávání (to už je docela velký web) a maximální velikost nahrávaných dat 100MB, potřebuješ mít nastaven memory_limit v php na alespoň 100MB, na serveru k dispozici alespoň 1GB operační paměti a volné místo na /tmp také alespoň 1GB.
19.09.2021 09:01
6
Původně odeslal josef.jebavy
Nastavené limity
Dekuji za odpoved, Josefe. V porovnani treba s TomasemX je famozni :)