More

    A PHP projekt gyorsítótárazással történő felgyorsítása

    A gyorsítótárazás olyan eszköz, amely lehetővé teszi, hogy megbirkózzon az alkalmazás terhelésének első ugrásaival, valamint a nagy projektekben az 29, 20218 minut16A cikk szerzője Ilya ZobenkoУскоряем PHP-проект с помощью кэширования1Ускоряем PHP-проект с помощью кэширования2A cikk szerzője Ilya ZobenkoУскоряем PHP-проект с помощью кэширования3https://gbcdn.mrgcdn.ru/uploads/post/2763/og_image/e2809128b5c54b7ec8fcf3f8a779bb3f.png

    Ускоряем PHP-проект с помощью кэширования4

    A cikk a PSR szabvány ajánlásait, valamint a gyorsítótár-szolgáltatások ezen szabványoknak megfelelő megvalósítását, valamint különböző szoftvermegoldásokat, gyorsítótár-csoportosítást és használati ajánlásokat tartalmaz.

    A projekt növekedésének ugrása, terhelése valódi teszt lehet A fejlesztő számára. A weboldal hosszú késéssel kezd reagálni, a méretezés kérdése egyre fontosabbá válik. Számos hatékony megoldás létezik a projekt stabilitásának növelésére a munka terhelésére és sebességére, az egyik legalapvetőbb a gyorsítótár.

    A gyorsítótárazás ideiglenesen tárolja az adatokat nagyon hozzáférhető helyeken, hogy gyorsabban visszakereshető legyen, mint az eredeti forrásból. A gyorsítótár használatának leggyakoribb példája az adatok adatbázisból történő beszerzése. Amikor először kap egy terméket egy adatbázisból, azt egy bizonyos ideig tárolja a gyorsítótárban, így a termék minden további kérése már nem zavarja az adatbázist: az adatok egy másik tárolóból érkeznek.

    Mik a megközelítések?

    A gyorsítótárazás számos megközelítése létezik. A PHP-kompatibilis eszközök listája megtalálható a PHP-gyorsítótár oldalon. A leggyakoribbak a következők:

    • Apcu
    • Tömb
    • Memcached
    • Redis

    Derítsük ki, hogy mindegyiknek milyen tulajdonságai vannak, és hogyan különböznek egymástól.

    APCu

    Az egyik leggyakoribb, könnyen konfigurálható gyorsítótárazási eszköz a RAM-ba menti a szükséges adatokat. (Azt is tudja, hogyan kell gyorsítótárazni a közbenső kódot, de ez egy teljesen más történet) az apcu használatához meg kell győződnie arról, hogy telepítve van. Ehhez futtassa a következő parancsot a parancssorban:

     php-I / grep 'apc.engedélyezve ' # várják, hogy: # apc.engedélyezve = > tovább = > > tovább

    Egy másik módja annak, hogy ellenőrizze: hozzon létre egy fájlt index.php hívja fel a phpinfo () funkciót. Győződjön meg róla, hogy van egy webkiszolgáló a használt könyvtárhoz konfigurálva, majd nyissa meg a szkriptet a böngészőben a szerver címén keresztül. Érdekli az APCu szakasz: Ha van egy APCu támogatás: engedélyezett elem benne, akkor minden rendben van, továbbléphetünk.

    Ускоряем PHP-проект с помощью кэширования5

    Ha nincs telepítve az APCu, akkor a következő módon teheti meg:

    1. Indítson el egy terminál ablakot (Linux / macOS) vagy egy parancssort (Windows. Írja be a” cmd ” – t a keresésbe).
    2. Futtassa a parancsot:
     pecl install apcu apcu_bc
    1. Nyissa meg a php-t.ini konfigurációs fájl bármely szövegszerkesztőben, majd ellenőrizze, hogy a következő sorok állnak rendelkezésre:

     # Windows kiterjesztés = php_apcu.DLL kiterjesztés = php_apcu_bc.dll apc.engedélyezve=1 apc.enable_cli=1 # Linux / MacOS extension="apcu.so" extension="apc.so" apc.engedélyezve=1 apc.enable_cli=1
    1. Ha nincsenek meghatározott sorok, adja hozzá őket, majd mentse el a konfigurációs fájlt.
    2. Ismételje meg a telepített APCu ellenőrzését.

    Ennek a gyorsítótárazási megközelítésnek a használatához szükségünk lesz az alapvető funkciókra. Íme egy példa az alkalmazásukra:

     $CacheKey = 'product_1'; $TTL = 600; / / 10 perc.   // Az APCu $IsEnabled rendelkezésre állásának ellenőrzése = apcu_enabled (); / / ellenőrzi, hogy van-e adat a gyorsítótárban a $isexisted = apcu_exists($CacheKey) kulcs segítségével; / / menti az adatokat a gyorsítótárba. Ha sikeres, visszatér true // a $TTL argumentum határozza meg, hogy mennyi ideig tárolja a gyorsítótárat (másodperc) $isstored = apcu_store($CacheKey, ['név' => 'demo termék'], $TTL); / / beolvassa az adatokat a gyorsítótárból kulcs. Ha hiányoznak, hamis $adat = apcu_fetch($CacheKey); / / törli az adatokat a gyorsítótárból a kulcs $IsDeleted = apcu_delete($CacheKey); var_dump([ 'is_enabled' => $Isenabled, 'is_existed' = > $isExisted, 'is_stored' = > $isStored', 'is_deleted' = > $isDeleted, 'feted_data' = > $adat,]);

    Bármely gyorsítótár az kulcs-érték Tárolás: ez azt jelenti, hogy az adatokat egy speciális kulccsal tárolják, amelyet a hozzáféréshez használnak. Ebben az esetben a kulcsot a $CacheKey változó tárolja.

    OLVASS TOVÁBB:  "A" tűzőgép tesztelése "feladat különösen szokatlan volt."

    Fontos! Ez a megközelítés csak akkor működik, ha weboldal módban dolgozik, vagyis amikor a parancssorból fut, nem kap adatokat a gyorsítótárból, és minden, amit elmentett, törlődik, amikor a szkript befejeződik. Ez azonban nem okoz hibát.

    Tömb gyorsítótár

    Egyszerűbb, de nem mindig alkalmazható gyorsítótárazási módszer. Ha az APCu elmenti az adatokat, és azt az összes folyamat későbbi végrehajtásához elérhetővé teszi, akkor a tömb gyorsítótár csak a feldolgozott kérelem keretében tárolja.

    OLVASS TOVÁBB:  Hogyan lehet pénzt keresni az Android-alkalmazásokban a Play piacon

    Mit jelent ez? Képzelje el, hogy van egy oldala felhasználói megjegyzésekkel. Egy felhasználó több üzenetet is hagyhat, és amikor ezeket az adatokat összegyűjtjük, többször nem akarunk ugyanannak a felhasználónak az adatbázisába menni. Amit tehetünk, hogy a fogadott adatokat egy tömbbe mentjük, hogy ha van ilyen, ne tegyünk ismételt kérelmet. Ez az elv nagyon egyszerű és ugyanolyan könnyen megvalósítható. Írjunk egy osztályt, amely ilyen mentést hajt végre:

     class CustomArrayCache {/***a tömb privát és statikus * - privát, így csak * az osztály metódusaiból érhető el.      * - statikus-annak érdekében, hogy a tulajdonság minden esetben elérhető legyen * / privát statikus tömb $memory = []; / / módszer az adatok tárolására a memóriában public function store(string $key, $value): bool { self::$memory[$key] = $value; return true; } // módszer az adatok memória public function fetch(string $key) {return self::$memory[$key] ?? null;} / / módszer adatok törlésére a memóriából public function delete (string $key): bool { unset (self::$memory[$key]); return true;} / / módszer az adatok hozzáférhetőségének ellenőrzésére kulcs nyilvános funkció létezik(string$key): bool { return array_key_exists($key, self:$memory); } }

    Korlátai miatt ezt a megközelítést ritkán használják, de hasznos tudni róla.

    Memcached és Redis

    A legfejlettebb gyorsítótár-megközelítések. Ezek magukban foglalják a Memcached vagy a Redis szerver jelenlétét, amely külön fut. A PHP-ből csatlakozunk ehhez a szerverhez a címen és a porton. Ezeknek a megoldásoknak a konfigurálása bonyolultabb, mint egy APCu beállítása,de az adattárolási módszer nagyon hasonló: RAM. Legfontosabb előnyeik a következők

    • elkülönítés a PHP-től: külön szolgáltatások felelősek a gyorsítótárért;
    • klaszterezési képesség: ha a projekt terhelése nagyon magas, a gyorsítótárazási szolgáltatások klaszterezése segít megbirkózni vele.

    Ebben a cikkben nem fogunk belemenni a Memcached és a Redis konfigurálásának részleteibe. Ebben a szakaszban fontos megjegyezni, hogy ha a terhelés nagyon magas, akkor ezekre a megoldásokra kell figyelnünk, mivel jó méretezési potenciállal rendelkeznek.

    PSR-16 szabvány

    A PSR-nek két szabványa van a gyorsítótárazásra: PSR-6 (normál gyorsítótárazási felület) és PSR-16 (egyszerű gyorsítótárazási felület) — a PSR-16-ra összpontosítunk.

    Ez a szabvány egy speciális felületet (cacheinterface) kínál, amelyet a gyorsítótárazási funkciót ellátó osztályok kielégíthetnek. Elmondása szerint az ilyen osztályoknak a következő módszereket kell végrehajtaniuk:

    • get ($kulcs, $ alapértelmezett) – adatok beszerzése a gyorsítótárból: a második argumentum átadja azt az értéket, amelyet visszaad, ha ezek az adatok hiányoznak;
    • set ($kulcs, $ érték, $TTL = null) – adatok mentése a gyorsítótárba: amint azt korábban láttuk, a harmadik paraméter másodpercek alatt átadja a tárolási időt. Ha üresen hagyja (null), az érték alapértelmezés szerint a gyorsítótár konfigurációjából kerül helyettesítésre;
    • törlés ($kulcs) – adatok törlése kulcs szerint;
    • tiszta () – törli a teljes tároló;
    • getMultiple ($kulcsok, $alapértelmezett) – lehetővé teszi, hogy több kulcs adatait egyszerre kapja meg;
    • setMultiple ($értékek, $TTL = null) – lehetővé teszi, hogy egyszerre több értéket rögzítsen. $Értékként átadunk egy asszociatív tömböt, ahol a kulcs $kulcs a gyorsítótárhoz, az érték pedig az adatok mentése;
    • deleteMultiple ($kulcsok) – több kulcs adatainak törlése;
    • van ($kulcs) – ellenőrzi a rendelkezésre álló legfontosabb adatokat.
    OLVASS TOVÁBB:  "Megszökött az enyémtől a front-end fejlesztésig"

    Mint látható, az interfész nagyon egyszerű, sőt az APCu példában figyelembe vett funkciók is elegendőek ahhoz, hogy a gyorsítótár-szolgáltatást a PSR-16 szerint írjuk. De miért van szükség?

    A PSR szabványoknak való megfelelés fő előnyei a következők

    • a legnépszerűbb könyvtárak támogatják őket;
    • sok PHP programozó ragaszkodik a PSR-hez, így könnyen hozzá lehet szokni a kódhoz;
    • az interfésznek köszönhetően könnyen helyettesíthetjük a használt szolgáltatást bármely más, a PSR-16-ot támogató szolgáltatással.

    Nézzük meg közelebbről az utolsó pontot és annak előnyeit.

    PSR-16 könyvtárak csatlakoztatása

    Azok a könyvtárak, amelyek “csomagolást” hoznak létre a meglévő gyorsítótárazási eszközök felett, hogy megfeleljenek az interfésznek, adaptereknek nevezik. Vegyük például a már tárgyalt módszerek adaptereit:

    • APCu Adapter;
    • Tömb Adapter;
    • Memcached Adapter;
    • Redis Adapter.
    OLVASS TOVÁBB:  Kérdések az adatszakértők karrierjéről: mérnökök, elemzők,Fejlesztők-Mediascope answers

    Mindegyik kielégíti a PSR-16-ot, ezért ugyanúgy alkalmazzák, de mindegyiknek megvan a saját logikája “a motorháztető alatt”.

    Például töltsünk be APCu és Tömb adapterek a projekt segítségével Zeneszerző.

     composer igényel cache / array-adapter composer igényel cache / apcu-adapter # vagy composer req cache / apcu-adapter cache / array-adapter

    Képzeljük el, hogy van egy speciális osztályunk az adatbázisból származó termékek beszerzéséhez. Nevezzük ProductRepository, van egy find($id) módszer, amely visszaadja a terméket az azonosító, ha nincs ilyen termék, null.

     class ProductRepository {/***annak érdekében, hogy ne bonyolítsuk a példát, írjuk elő, hogy egy tömb termékként kerül vissza*, ha nincs ott, null * / public function find (int $id): ?array { / / ...         // Adatok beszerzése az adatbázisból $someproduct;} }

    Ha engedélyezni akarjuk a gyorsítótárazást, akkor azt nem szabad a tárolón belül megtenni, mert felelőssége az adatok visszaküldése az adatbázisból. Hol adjuk hozzá a gyorsítótárat? Számos népszerű megoldás létezik, a legegyszerűbb egy további szolgáltató osztály. Csak annyit fog tenni, hogy megpróbál adatokat szerezni a gyorsítótárból, ha ez nem sikerül, kapcsolatba lép a tárolóval. Ehhez két függőséget határozunk meg egy ilyen osztály konstruktorában — a tárolónkban és a CacheInterface-ben. Miért a felület? Mivel így képesek leszünk az említett adapterek vagy más osztályok bármelyikét használni, amelyek kielégítik a PSR-16-ot.

    Friss cikkek

    Kapcsolódó történetek

    HOZZÁSZÓLOK A CIKKHEZ

    Kérjük, írja be véleményét!
    írja be ide nevét

    Maradjon op - Ge a napi híreket a postaládájában