Teljesítmény
A shikiphp valódi TextMate tokenizálást végez tisztán PHP nyelven, ezért érdemes tisztázni, mikor gyors és mikor nem.
Mire számíthat
Fájlonként tíz-száz milliszekundummal számoljon, ne mikroszekundumokkal. A tokenizer gyorsítótárazza a lefordított szabályokat és szkennereket, a nyelvtanok lustán töltődnek be (az a minta, amely nem érint beágyazott nyelvet, annak dekódolási költségét sem viseli), és a legtöbb nyelvtani minta natív preg_* használatával, ekvivalencia-ellenőrzéssel ellátott PCRE gyors útvonalon fut; a többit a tisztán PHP nyelvű illesztő kezeli (lásd: Architektúra).
Ezek a tároló benchmarkjából származó, bemelegített, egyszeri hívásra mért idők (bench/bench.php, github-dark téma), egyetlen gépen, nagyjából 55–105 soros korpuszfájlok esetén:
| Nyelvtan | PHP 8.2 | PHP 8.4 |
|---|---|---|
| JSON, YAML | 30–65 ms | 25–45 ms |
| CSS, HTML | 100–120 ms | 80–100 ms |
| Python, Rust, Go, Bash, Markdown | 190–220 ms | 125–175 ms |
| PHP | körülbelül 290 ms | körülbelül 170 ms |
| TypeScript, TSX | 490–510 ms | 310–370 ms |
Egy folyamatban az adott nyelv első használata egyszeri nyelvtanbetöltési és -fordítási költséggel is jár: ugyanazokban a futásokban JSON esetén ez 50–70 ms, Markdown esetén pedig valamivel több mint egy másodperc volt. A költség a nyelvtan összetettségétől és a bemenet méretétől függ; az értékek gépenként eltérnek, ezért mérje meg a saját környezetében: a tároló klónjában futtassa a composer install, majd a composer bench parancsot.
Biztonsági korlátok
A reguláriskifejezés-motor hibamemorizálást és ReDoS-védelmet használ, így a kóros minták lassulást okoznak ahelyett, hogy végtelen várakozásra kényszerítenének. A soronkénti feldolgozást is korlátozhatja a tokenizeMaxLineLength beállítással: az adott hosszúságú vagy annál hosszabb sorokat egyetlen egyszerű tokenné alakítja, védelmet nyújtva a rosszindulatú egysoros bemenetek ellen.
Gyorsítótárazás éles környezetben
A kiemelést úgy tarthatja távol megbízhatóan a kérések feldolgozási útvonalától, ha nem futtatja minden kérésnél. Ugyanannak a kódnak azonos beállításokkal történő kiemelése mindig ugyanazt a HTML eredményezi, ezért kiválóan gyorsítótárazható:
- Kiemelés buildidőben statikus webhelyekhez és dokumentációhoz.
- A megjelenített HTML gyorsítótárazása (a kód és a beállítások alapján) a felhasználó által megadott vagy adatbázisban tárolt kódrészletekhez, majd újrafelhasználása a forrás módosulásáig.
Egy folyamaton belül használja újra ugyanazt a kiemelőt (az Shikiphp homlokzat ezt elvégzi Ön helyett), így a nyelvtani és témagyorsítótárak megoszthatók a hívások között.