Koliko zapravo košta učitavanje cijelog lib/
O sadržaju i njegovoj provjeri
U ovom članku
Redak 46 jedine ulazne datoteke ove usluge:
foreach (glob(__DIR__ . '/lib/*.php') as $f) { require_once $f; }
To je 65 datoteka i 1,5 megabajta koji se učitavaju pri svakom zahtjevu. Slika brojača, stranica statistike, 404 — sve isto. Jučer se to dogodilo 20.734 puta.
Važna je mala brojka
Učitavanje svega od nule, s isključenom predmemorijom operacijskog koda, traje otprilike 132 milisekunde. To je brojka zbog koje bi ovo bilo problem, a poslužitelj ne plaća tu brojku.
Kada je operacijski kod već preveden i čuva se u dijeljenoj memoriji, ostaje popis direktorija i jedan stat() po datoteci jer je provjera vremenskih oznaka uključena: 0,33 milisekunde. Uz jučerašnji promet to je manje od sedam sekundi rada tijekom cijelog dana.
Između je treće mjerenje, 18,2 milisekunde, provedeno kada je predmemorija operacijskog koda čitala s diska umjesto iz memorije. To je gornja granica, a ne stvarna brojka — događa se kada predmemorija postoji, ali je sporija od stvarne. Navodi se jer je to jedina topla brojka koja se može izmjeriti iz naredbenog retka, a pretvarati se drukčije bila bi laka pogreška.
Dakle, ovo ne košta gotovo ništa, a tako je isključivo zbog nečeg drugog. Isključite predmemoriju operacijskog koda i isti redak košta četiristo puta više. To je stvarna ovisnost i vrijedi znati da postoji umjesto otkriti je tijekom nadogradnje.
Što je zapravo u 1,5 megabajta
Četrdeset sedam posto — 715 kilobajta u 26 datoteka — skupine su dizajna brojača. Iscrtavanje slike brojača treba točno jednu. Preostalih 25 učitava se, deklarira i nikada ne koristi.
Zatim: 189 kilobajta podataka zastava, potrebnih na geografskoj stranici; 158 kilobajta biblioteke grafikona, potrebnih kada se nešto iscrtava kao grafikon. Nijedno ne sudjeluje u isporuci slike brojača, a to je zahtjev na koji ova usluga odgovara češće nego na bilo koji drugi.
Vidljivi trošak toga memorija je, a ne vrijeme. Vršna memorija po zahtjevu raste za otprilike četiri megabajta i, za razliku od operacijskog koda — koji je zajednički svim procesima — taj dio plaća se po zahtjevu, usporedno, za svaki radni proces odjednom.
Netko je već primijetio
Obrazac glob jest lib/*.php. Nije rekurzivan, a dva su direktorija odmah ispod njega: lib/live/ s 229 kilobajta i lib/recht/ sa 182 kilobajta. Četiristo kilobajta koji su prije bili na putu učitavanja, a sada nisu.
Premješteni su jer su veliki i rijetko potrebni: odjeljci statistike i pravni tekstovi. Cijeli je mehanizam jedan direktorij dublje. Nema konfiguracije, odgođenog učitavača ni mape automatskog učitavanja — datoteka je ili u obrascu glob ili nije.
To je stvaran popravak i vrijedi tako reći jer bi očit sljedeći korak bio automatski učitavač, a on bi ovdje bio velika promjena za rješavanje problema koji je naredba mkdir već riješila dvaput.
Zašto ostaje
Jedan obrazac glob najjednostavnije je što uopće može raditi, a dokazi pokazuju da radi: trećina milisekunde na malom poslužitelju, na putu koji mora biti brz. Zamjena pojedinačnim naredbama require po datoteci znači da svaka nova datoteka negdje treba redak, a zaboravljeni redak stvara fatalnu pogrešku u produkciji umjesto malo većeg učitavanja.
Ono što treba jest zapisati ono što mu je od početka omogućilo opstanak: ako datoteka u lib/ postane velika, premješta se u poddirektorij i učitava naredbom require ondje gdje se koristi. To je pravilo koje su ta dva direktorija slijedila i dosad nigdje nije bilo zapisano.
Opća verzija dosadnija je od mjerenja. „Sve učitava sve“ obično je pogrešan oblik i vrijedi izmjeriti koliko košta prije ponovne izrade. Ovdje košta 0,33 milisekunde i četiri megabajta, a četiri megabajta dio su koji vrijedi pratiti jer rastu s brojem istodobnih zahtjeva, a milisekunde ne.