Kešota AST meklēšana
Kešota AST meklēšana ir papildinošs uzsildītās kešatmiņas režīms līdzās faktu indeksam. Tā vietā, lai saglabātu izgūtos faktus un atkārtoti parsētu atbilstošos failus, kešatmiņā diskā tiek glabāti serializēti parsētie koki. Turpmākajos vaicājumos koki tiek deserializēti un atbilstības meklētājs tiek palaists tieši, pilnībā izlaižot PHP-Parser konveijeru.
Kešatmiņa ir pieejama apakškomandā greph-index ast-cache CLI un fasādes metodēs Greph::buildAstCache() / Greph::searchAstCached(). Tā atbalsta arī vairāku indeksu un uz manifestiem balstītu kopu meklēšanu.
Kešatmiņas izveide
# Full build at the current directory
./vendor/bin/greph-index ast-cache build .
# Use a non-default cache directory
./vendor/bin/greph-index ast-cache build . --index-dir /tmp/greph-ast-cache
# Build a cache that may refresh automatically for small changes
./vendor/bin/greph-index ast-cache build . \
--lifecycle opportunistic-refresh \
--auto-refresh-max-files 32 \
--auto-refresh-max-bytes 1048576
Pēc noklusējuma kešatmiņa tiek glabāta mapē <root>/.greph-ast-cache/. Kešatmiņas izveide parasti ir lēnākā no trim indeksēšanas režīmiem, jo katrs fails ir jāparsē vienu reizi.
Pēc veiksmīgas izveides tiek parādīts kopsavilkums vienā rindā:
Built AST cache for 2547 files in .greph-ast-cache (2541 cached trees, +2541 ~0 -0 =0)
Kešoto koku skaits parasti ir nedaudz mazāks nekā failu skaits, jo faili, kurus neizdodas parsēt un kuri tiek klusi izlaisti, kešā netiek ierakstīti. Meklēšanas komandai pievienojiet --strict-parse, ja vēlaties, lai parsēšanas kļūdas tiktu parādītas.
Kešatmiņas atsvaidzināšana
./vendor/bin/greph-index ast-cache refresh .
refresh atkārtoti pārstaigā indeksēto saknes direktoriju, parsē izmainītos failus no jauna un pārraksta tikai tos kešotos kokus, kas ir mainījušies.
Dzīves cikla profili atbilst citiem režīmiem ar iesildītu kešatmiņu:
static: nekad automātiski nepārbauda, vai dati ir aktuāli, un neveic izmaiņasmanual-refresh: ziņo par novecojušiem datiem laukāstats, bet meklēšanas laikā nekad neatsvaidzinaopportunistic-refresh: meklēšanas laikā atsvaidzina tikai tad, ja izmainīto failu skaits nepārsniedz konfigurētos sliekšņusstrict-stale-check: noraida novecojušus meklēšanas pieprasījumus, nevis atsvaidzina datus
Vaicājumi kešatmiņai
./vendor/bin/greph-index ast-cache search 'new $CLASS()' src
./vendor/bin/greph-index ast-cache search '$obj->$method($$$ARGS)' src
./vendor/bin/greph-index ast-cache search --json 'array($$$ITEMS)' src
./vendor/bin/greph-index ast-cache search --fallback scan 'new $CLASS()' src
./vendor/bin/greph-index ast-cache search --trace-plan 'array($$$ITEMS)' src
Karodziņu kopa ir identiska ast-index search, tostarp --fallback scan trūkstošām kešatmiņām.
Meklēšana vairākos indeksos kešatmiņā
Atkārtojiet --index-dir, lai vienā izsaukumā meklētu vairākās kešatmiņās ar iesildītiem datiem:
./vendor/bin/greph-index ast-cache search \
--index-dir ../wordpress/.greph-ast-cache \
--index-dir ./.greph-ast-cache \
--show-index-origin \
'array($$$ITEMS)' .
Kešatmiņas kopas, kuru pamatā ir manifests
Ja jau uzturat nosauktas kopas ar iesildītiem datiem, to pašu manifestu var izmantot kešotai AST meklēšanai:
./vendor/bin/greph-index set build --mode ast-cache
./vendor/bin/greph-index set stats --mode ast-cache --dry-refresh
./vendor/bin/greph-index set search --mode ast-cache --show-index-origin 'array($$$ITEMS)' .
Plānotāja diagnostika
--trace-plan nosūta kešotā AST plānotāja lēmumus uz stderr, tostarp:
- kurās kešatmiņās ar iesildītiem datiem tika meklēts
- vai tika izpildīta novecojušu datu atsvaidzināšanas loģika
- kandidātfailu skaits pēc failu līmeņa filtrēšanas
- cik kešoto koku tika deserializēti precīzai strukturālajai salīdzināšanai
Kešatmiņa un faktu indekss
Abi režīmi paātrina AST meklēšanu, taču ir optimizēti atšķirīgiem darba veidiem.
| Aspekts | Faktu indekss (ast-index) |
Kešatmiņa (ast-cache) |
|---|---|---|
| Kas tiek glabāts | Izgūtie fakti (izsaukumu nosaukumi, klašu nosaukumi, deklarācijas) | Serializēti parsēti koki |
| Izveides izmaksas | Zemākas | Augstākas (tiek parsēts viss) |
| Izveides apjoms | Mazāks | Lielāks |
| Vaicājuma izpilde | Filtrē pēc faktiem, pēc tam parsē un salīdzina kandidātus | Deserializē koku, pēc tam to salīdzina |
| Vispiemērotākais | Rakstiem ar atpazīstamu sākumu (izsaukuma nosaukumu, klases nosaukumu) | Rakstiem, kuru atšķirīgā iezīme ir strukturāla, nevis saistīta ar nosaukumu |
| Vismazāk piemērots | Rakstiem, kuru sākums ir metavariabls | Vaicājumiem ar neiesildītu kešatmiņu, ja koks vairs neietilpst OS lapu kešatmiņā |
Praksē faktu indekss nodrošina ātrāko vaicājumu ar neiesildītu kešatmiņu, bet kešatmiņa — ātrāko vaicājumu ar iesildītu kešatmiņu. Izmantojiet to, kas labāk atbilst jūsu darba slodzei, vai izveidojiet abus un ļaujiet rīkiem izvēlēties.
Izmantošana programmā
use Greph\Greph;
use Greph\Ast\AstSearchOptions;
use Greph\Index\IndexLifecycleProfile;
Greph::buildAstCache('.', lifecycle: IndexLifecycleProfile::Static);
$matches = Greph::searchAstCached(
'array($$$ITEMS)',
'src',
new AstSearchOptions(jobs: 4, tracePlan: true),
);
searchAstCached pieņem tādus pašus AstSearchOptions kā vietējā AST meklēšana un atgriež tādas pašas formas list<AstMatch>. Vienīgā atšķirība ir tā, ka failiem, kuri jau atrodas kešatmiņā, parsētāja konveijers tiek izlaists. Vairāku indeksu vai manifestā balstītām darbplūsmām izmantojiet searchAstCachedMany(...) un searchAstCachedSet(...).
Kad to izmantot
AST režīms ar kešatmiņu ir piemērots, ja:
- Atkārtoti veicat strukturālus vaicājumus tai pašai koda bāzei.
- Iepriekšējās izpildēs šaurā vieta bija PHP-Parser (profilos redzams laiks, kas pavadīts leksiskajā un sintaktiskajā analīzē).
- Varat atvēlēt vietu diskā serializēto koku krātuvei.
Ja vaicājumi parasti skar nelielu koda bāzes daļu un atbilstības galvenokārt saistītas ar atpazīstamiem izsaukumu vai klašu nosaukumiem, parasti piemērotāks ir faktu indekss. Ja vaicājumi aptver plašu koda bāzes daļu, bet varat samaksāt vienreizējās parsēšanas izmaksas, labāk noderēs kešatmiņa.