Našumas
shikiphp iš tikrųjų žetonizuoja TextMate naudodamas gryną PHP, todėl verta aiškiai pasakyti, kur jis veikia sparčiai, o kur — ne.
Ko tikėtis
Tikėkitės, kad vienai rinkmenai prireiks dešimčių ar šimtų milisekundžių, o ne mikrosekundžių. Žetonizatorius išsaugo sukompiliuotas taisykles ir analizatorius talpykloje, gramatikos įkeliamos prireikus (jei pavyzdyje nėra įterptosios kalbos, nereikės gaišti laiko jos iškodavimui), o dauguma gramatikos šablonų apdorojami savajame preg_* lygiaverčių rezultatų patikra apribotame PCRE sparčiajame kelyje; likusius apdoroja grynas PHP palyginimo mechanizmas (žr. Architektūra).
Tai šilti vieno iškvietimo laikai iš saugyklos našumo bandymo (bench/bench.php, tema github-dark), atlikto viename kompiuteryje su maždaug 55–105 eilučių rinkinio rinkmenomis:
| Gramatika | 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 | apie 290 ms | apie 170 ms |
| TypeScript, TSX | 490–510 ms | 310–370 ms |
Pirmą kartą naudojant kalbą procese, vienąkart sugaištama gramatikai įkelti ir sukompiliuoti: tų pačių bandymų metu tai truko nuo 50–70 ms su JSON iki kiek daugiau nei sekundę su Markdown. Trukmė priklauso nuo gramatikos sudėtingumo ir įvesties dydžio, o rezultatai kinta pagal įrangą, todėl išmatuokite patys: saugyklos kopijoje paleiskite composer install, tada composer bench.
Saugos apsaugos priemonės
Reguliariųjų išraiškų variklis įsimena nesėkmes ir saugo nuo ReDoS atakų, todėl apdorojimas pagal patologinį šabloną sulėtėja, o ne užstringa. Taip pat galite apriboti kiekvienos eilutės apdorojimo darbą naudodami tokenizeMaxLineLength; tada bet kokio ilgio ribą pasiekusiai ar ją viršijusiai eilutei pateikiamas vienas paprastas žetonas — apsauga nuo kenkėjiškų vienos eilutės įvesčių.
Talpykla produkcinėje aplinkoje
Patikimiausias būdas neįtraukti paryškinimo į užklausos apdorojimą — jo nevykdyti kiekvienos užklausos metu. Tas pats kodas su tomis pačiomis parinktimis visada duoda tą patį HTML, todėl jį puikiai galima laikyti talpykloje:
- Paryškinkite kodą kūrimo metu statinėms svetainėms ir dokumentacijai.
- Atvaizduotą HTML (raktas: kodas + parinktys) laikykite talpykloje naudotojų pateiktiems ar duomenų bazėje saugomiems fragmentams ir naudokite pakartotinai, kol pasikeis pradinis kodas.
Procese pakartotinai naudokite vieną paryškintuvą (Shikiphp fasadas tai padaro už jus), kad gramatikų ir temų talpyklos būtų bendrinamos tarp iškvietimų.