Mida kogu lib/ laadimine tegelikult maksab
Sisust ja selle ülevaatamisest
Selles artiklis
Selle teenuse ainsa sisendfaili rida 46:
foreach (glob(__DIR__ . '/lib/*.php') as $f) { require_once $f; }
See on 65 faili ja 1,5 megabaiti, laaditud igal päringul. Loenduri pilt, statistikaleht, 404 — kõik üks ja seesama. Eile juhtus see 20 734 korda.
Oluline on väike arv
Kõige laadimine nullist, opkoodi vahemälu välja lülitatult, võtab umbes 132 millisekundit. See on arv, mis teeks sellest probleemi, ja see ei ole arv, mida server maksab.
Kui opkoodid on juba kompileeritud ja hoitud jagatud mälus, jääb alles kataloogiloend ja üks stat() faili kohta, sest ajatempli kontroll on sees: 0,33 millisekundit. Eilse liikluse juures on see kogu päeva peale alla seitsme sekundi tööd.
Vahele jääb kolmas mõõtmine, 18,2 millisekundit, mis tehti nii, et opkoodi vahemälu luges mälu asemel kettalt. See on pigem ülempiir kui tegelik arv — juhtub siis, kui vahemälu on olemas, aga aeglasem kui päris. Seda esitatakse, sest see on ainus soe arv, mida saab käsurealt mõõta, ja teisiti teeskleda oleks lihtne viga.
Seega: see maksab peaaegu mitte midagi ja maksab peaaegu mitte midagi täielikult millegi muu tõttu. Lülitage opkoodi vahemälu välja ja sama rida maksab neli sada korda rohkem. See on päris sõltuvus ja seda tasub teada, mitte avastada uuenduse ajal.
Mis tegelikult on nendes 1,5 megabaidis
Nelikümmend seitse protsenti sellest — 715 kilobaiti 26 failis — on loenduri kujunduse perekonnad. Loenduri pildi joonistamiseks on vaja täpselt ühte. Teised 25 laaditakse, deklareeritakse ja neid ei puututa kunagi.
Pärast seda: 189 kilobaiti lipuandmeid, mida vajatakse geograafialehel; 158 kilobaiti diagrammiteeki, mida vajatakse, kui miski joonistab diagrammi. Kumbki ei osale loenduri pildi teenindamises, mis on päring, millele see teenus vastab kõige rohkem.
Selle nähtav hind on pigem mälu kui aeg. Maksimaalne mälu päringu kohta kasvab umbes nelja megabaidi võrra ja erinevalt opkoodidest — mis on kõigi protsesside vahel jagatud — makstakse see osa päringu kohta, paralleelselt, iga töötaja poolt korraga.
Keegi on juba märganud
Glob on lib/*.php. See ei ole rekursiivne ja vahetult selle all asub kaks kataloogi: lib/live/ mahuga 229 kilobaiti ja lib/recht/ mahuga 182 kilobaiti. Neli sada kilobaiti, mis olid varem laadimisteel ja nüüd enam ei ole.
Need viidi ära, sest need on suured ja neid on harva vaja: statistikajaotised ja õigustekstid. Ühe kataloogi võrra sügavamal olemine on kogu mehhanism. Konfiguratsiooni, laisklaadijat ega autoload-kaarti ei ole — fail on kas globis või ei ole.
See on päris parandus ja seda tasub öelda, sest ilmne järgmine samm oleks automaatlaadija ja automaatlaadija siin oleks suur muudatus probleemi lahendamiseks, mille mkdir on juba kaks korda lahendanud.
Miks see jääb
Üks glob on lihtsaim asi, mis üldse võib töötada, ja tõendite põhjal see töötab: kolmandik millisekundit, väikesel serveril, teel, mis peab olema kiire. Selle asendamine faili-kaupa require-ga tähendab, et iga uus fail vajab kuskil rida ja unustatud rida põhjustab toodangus fataalse vea, mitte natuke suuremat laadimist.
Mida see vajab, on see, mis selle üldse talutavaks tegi, üles kirjutatud: kui fail kaustas lib/ läheb suureks, viiakse see alamkataloogi ja nõutakse seal, kus seda kasutatakse. See on reegel, mida need kaks kataloogi järgisid, ja seda ei olnud kuskile kirjutatud kuni praeguseni.
Üldine versioon on igavam kui mõõtmine. „Kõik laadib kõike“ on tavaliselt vale kuju ja enne selle ümberehitamist tasub mõõta, mida see maksab. Siin maksab see 0,33 millisekundit ja nelja megabaiti ning need neli megabaiti on osa, mida tasub jälgida, sest need skaleeruvad samaaegsusega ja millisekundid mitte.