Contactați asistența

Răspundem prin e-mail, de obicei în două zile.

Google reCAPTCHA verifică această trimitere împotriva abuzurilor; date sunt trimise către Google. Scriptul se încarcă doar când acest formular este deschis.

← Toate articolele

Cât costă de fapt încărcarea întregului lib/

Linia 46 din singurul fișier de intrare al acestui serviciu:

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

Asta înseamnă 65 de fișiere și 1,5 megaocteți, încărcați la fiecare cerere. O imagine de contor, o pagină de statistici, un 404 — toate la fel. Ieri s-a întâmplat asta de 20.734 de ori.

26 de familii de designuri de contoare — 715 KB, se folosește una steaguri 189 KB · diagrame 158 KB · tot restul 470 KB la rece, fără cache de opcode: 132 ms opcode-uri în cache pe disc: 18,2 ms opcode-uri în memoria partajată: 0,33 ms — glob-ul și 65 de apeluri stat 65 de fișiere, 1,5 MB, 56 de clase, la fiecare cerere

Cifra care contează este cea mică

Încărcarea tuturor de la zero, cu cache-ul de opcode dezactivat, durează circa 132 de milisecunde. Aceasta este cifra care ar face din asta o problemă, și nu este cifra pe care o plătește serverul.

Cu opcode-urile deja compilate și ținute în memoria partajată, rămân listarea directorului și câte un stat() pe fișier, pentru că validarea marcajelor de timp este activă: 0,33 milisecunde. La traficul de ieri, asta înseamnă sub șapte secunde de lucru pe întreaga zi.

Între ele se află o a treia măsurătoare, 18,2 milisecunde, făcută cu cache-ul de opcode citind de pe disc în loc de memorie. Este mai degrabă o limită superioară decât cifra reală — este ceea ce se întâmplă când cache-ul există, dar e mai lent decât cel real. O raportăm pentru că este singura cifră la cald care poate fi măsurată din linia de comandă, iar a pretinde altceva ar fi greșeala comodă.

Deci: asta nu costă aproape nimic, și nu costă aproape nimic numai datorită altui lucru. Dezactivați cache-ul de opcode și aceeași linie costă de patru sute de ori mai mult. Este o dependență reală și merită să știți că există, în loc să o descoperiți în timpul unei actualizări.

Ce se află de fapt în cei 1,5 megaocteți

Patruzeci și șapte la sută din ei — 715 kiloocteți în 26 de fișiere — sunt familii de designuri de contoare. Desenarea unei imagini de contor are nevoie de exact una dintre ele. Celelalte 25 sunt încărcate, declarate și niciodată atinse.

Apoi: 189 de kiloocteți de date despre steaguri, necesari pe pagina de geografie; 158 de kiloocteți de bibliotecă de diagrame, necesari când ceva desenează o diagramă. Niciuna dintre ele nu participă la livrarea unei imagini de contor, care este cererea la care acest serviciu răspunde mai des decât la oricare alta.

Costul vizibil al acestui lucru este memoria, nu timpul. Vârful de memorie per cerere crește cu circa patru megaocteți și, spre deosebire de opcode-uri — care sunt partajate între toate procesele — această parte se plătește la fiecare cerere, în paralel, de fiecare worker deodată.

Cineva a observat deja

Glob-ul este lib/*.php. Nu este recursiv, iar chiar sub el se află două directoare: lib/live/ cu 229 de kiloocteți și lib/recht/ cu 182 de kiloocteți. Patru sute de kiloocteți care înainte se aflau pe calea de încărcare și acum nu mai sunt.

Au fost mutate pentru că sunt mari și rareori necesare: secțiunile de statistici și textele juridice. Faptul că stau cu un director mai jos este tot mecanismul. Nu există configurație, niciun încărcător leneș, nicio hartă de autoload — un fișier fie intră în glob, fie nu.

Este o reparație reală și merită spus, pentru că următorul pas evident ar fi un autoloader, iar un autoloader aici ar fi o schimbare mare pentru a rezolva o problemă pe care un mkdir a rezolvat-o deja de două ori.

De ce rămâne

Un singur glob este cel mai simplu lucru care poate funcționa și, după toate dovezile, chiar funcționează: o treime de milisecundă, pe un server mic, pe calea care trebuie să fie rapidă. Înlocuirea lui cu câte un require pentru fiecare fișier înseamnă că fiecare fișier nou are nevoie de o linie undeva, iar linia uitată produce o eroare fatală în producție, nu o încărcare puțin mai mare.

De ce are totuși nevoie este ca lucrul care l-a făcut suportabil de la bun început să fie scris: dacă un fișier din lib/ devine mare, se mută într-un subdirector și se încarcă cu require acolo unde este folosit. Aceasta este regula pe care o urmau cele două directoare, și nu era scrisă nicăieri până acum.

Versiunea generală este mai banală decât măsurătoarea. „Totul încarcă totul” este de obicei forma greșită și merită măsurat cât costă înainte de a o reconstrui. Aici costă 0,33 milisecunde și patru megaocteți, iar cei patru megaocteți sunt partea de urmărit, pentru că cresc odată cu concurența, iar milisecundele nu.

Publicitate