Contact met ondersteuning

Wij antwoorden per e-mail, meestal binnen twee dagen.

Google reCAPTCHA controleert deze inzending op misbruik; daarbij worden gegevens naar Google gestuurd. Het script laadt pas wanneer dit formulier wordt geopend.

← Alle berichten

Wat het werkelijk kost om heel lib/ te laden

Regel 46 van het enige toegangsbestand van deze dienst:

foreach (glob(__DIR__ . '/lib/*.php') as $f) { require_once $f; }

Dat zijn 65 bestanden en 1,5 megabyte, geladen bij elke aanvraag. Een tellerafbeelding, een statistiekpagina, een 404 — alles hetzelfde. Gisteren gebeurde dat 20.734 keer.

26 families tellerontwerpen — 715 KB, er wordt er één gebruikt vlaggen 189 KB · grafieken 158 KB · al het andere 470 KB koud, zonder opcodecache: 132 ms opcodes op schijf gecachet: 18,2 ms opcodes in gedeeld geheugen: 0,33 ms — de glob en 65 stat-aanroepen 65 bestanden, 1,5 MB, 56 klassen, elke aanvraag

Het getal dat ertoe doet, is het kleine

Het geheel vanaf nul laden, met de opcodecache uit, kost ongeveer 132 milliseconden. Dat is het getal dat hiervan een probleem zou maken, en het is niet het getal dat de server betaalt.

Met opcodes die al gecompileerd zijn en in gedeeld geheugen staan, blijft er de mappenlijst over en één stat() per bestand, want tijdstempelcontrole staat aan: 0,33 milliseconde. Bij het verkeer van gisteren is dat minder dan zeven seconden werk over de hele dag.

Daartussen zit een derde meting, 18,2 milliseconden, gedaan met een opcodecache die van schijf leest in plaats van uit geheugen. Het is een bovengrens en niet het echte cijfer — het is wat er gebeurt wanneer de cache bestaat maar trager is dan de echte. Het wordt gemeld omdat het het enige warme getal is dat vanaf de opdrachtregel te meten valt, en doen alsof het anders was, zou de makkelijke fout zijn.

Dus: dit kost bijna niets, en het kost bijna niets volledig dankzij iets anders. Zet de opcodecache uit en dezelfde regel kost vierhonderd keer meer. Dat is een echte afhankelijkheid, en het is de moeite waard te weten dat hij er is in plaats van hem tijdens een verbetering te ontdekken.

Wat er werkelijk in de 1,5 megabyte zit

Zevenenveertig procent ervan — 715 kilobyte over 26 bestanden — zijn families tellerontwerpen. Een tellerafbeelding tekenen heeft er precies één van nodig. De andere 25 worden geladen, gedeclareerd en nooit aangeraakt.

Daarna: 189 kilobyte vlaggegevens, nodig op de geografiepagina; 158 kilobyte grafiekbibliotheek, nodig wanneer er iets een grafiek tekent. Geen van beide heeft iets te maken met het uitleveren van een tellerafbeelding, en dat is de aanvraag die deze dienst vaker beantwoordt dan welke andere ook.

De zichtbare kosten daarvan zijn geheugen en geen tijd. Het piekgeheugen per aanvraag gaat met ongeveer vier megabyte omhoog, en anders dan de opcodes — die tussen alle processen gedeeld worden — wordt dat deel per aanvraag betaald, parallel, door elke werker tegelijk.

Iemand had het al gemerkt

De glob is lib/*.php. Hij is niet recursief, en er zitten twee mappen net eronder: lib/live/ met 229 kilobyte en lib/recht/ met 182 kilobyte. Vierhonderd kilobyte die vroeger in het laadpad zaten en nu niet meer.

Ze zijn verplaatst omdat ze groot zijn en zelden nodig: de statistiekonderdelen en de juridische teksten. Eén map dieper staan is het hele mechanisme. Er is geen configuratie, geen luie lader, geen autoload-kaart — een bestand zit in de glob of het zit er niet in.

Dat is een echte oplossing en dat verdient gezegd te worden, want de voor de hand liggende volgende stap zou een autoloader zijn, en een autoloader zou hier een grote wijziging zijn om een probleem op te lossen dat een mkdir al twee keer heeft opgelost.

Waarom hij blijft

Eén glob is het eenvoudigste dat mogelijk kan werken, en op grond van het bewijs werkt het: een derde van een milliseconde, op een kleine server, op het pad dat snel moet zijn. Hem vervangen door requires per bestand betekent dat elk nieuw bestand ergens een regel nodig heeft, en de regel die vergeten wordt, levert in productie een fatale fout op in plaats van een iets grotere lading.

Wat hij wel nodig heeft, is het ding dat hem in de eerste plaats leefbaar maakte, opgeschreven: wordt een bestand in lib/ groot, dan verhuist het naar een submap en wordt het gerequired waar het gebruikt wordt. Dat is de regel die die twee mappen volgden, en tot nu toe stond hij nergens.

De algemene versie is saaier dan de meting. "Alles laadt alles" is meestal de verkeerde vorm, en het is de moeite waard te meten wat het kost voordat je het herbouwt. Hier kost het 0,33 milliseconde en vier megabyte, en de vier megabyte zijn het deel om in de gaten te houden, want die schalen mee met gelijktijdigheid en de milliseconden niet.

Advertentie