Performans
shikiphp, saf PHP içinde gerçek TextMate belirteçleme yapar; bu nedenle hangi durumlarda hızlı olduğunu ve olmadığını açıkça belirtmek gerekir.
Neler beklenmeli
Dosya başına mikrosaniyeler değil, onlarca ila yüzlerce milisaniye bekleyin. Belirteç ayrıştırıcısı derlenmiş kuralları ve tarayıcıları önbelleğe alır, dilbilgileri gerektiğinde yüklenir (gömülü bir dile hiç dokunmayan örnek, o dili çözümleme maliyetine katlanmaz) ve dilbilgisi desenlerinin çoğu eşdeğerlik denetimli PCRE hızlı yolunda yerel preg_* üzerinden çalışır; geri kalanını saf PHP eşleştiricisi işler (bkz. Mimari).
Bunlar, depodaki kıyaslama aracından (bench/bench.php, tema github-dark) alınmış, tek bir makinede yaklaşık 55 ila 105 satırlık derlem dosyaları için, ön ısıtmalı tek çağrı süreleridir:
| Dilbilgisi | 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 | yaklaşık 290 ms | yaklaşık 170 ms |
| TypeScript, TSX | 490–510 ms | 310–370 ms |
Bir dilin süreçteki ilk çağrısında tek seferlik dilbilgisi yükleme ve derleme maliyeti de vardır: aynı çalıştırmalarda bu süre JSON için 50–70 ms, Markdown içinse bir saniyeyi biraz aşan bir değerdi. Maliyet, dilbilgisi karmaşıklığına ve girdi boyutuna göre değişir; donanıma bağlı olarak süreler de farklılaşır. Bu yüzden kendi ortamınızda ölçün: depoyu klonlayıp önce composer install, ardından composer bench komutunu çalıştırın.
Güvenlik önlemleri
Düzenli ifade altyapısı, başarısızlıkları belleğe alma ve ReDoS koruması içerir; böylece sorunlu bir desen sistemi kilitlemek yerine yavaşlar. Ayrıca, tokenizeMaxLineLength ile satır başına yapılan işi sınırlayabilirsiniz. Bu seçenek, belirlenen uzunluğa eşit veya daha uzun satırları tek bir düz metin belirtecine dönüştürerek tek satırlık kötü amaçlı girdilere karşı koruma sağlar.
Üretimde önbellekleme
Vurgulama işleminin istek yolunu etkilemesini önlemenin güvenilir yolu, onu her istekte çalıştırmamaktır. Aynı kodu aynı seçeneklerle vurgulamak her zaman aynı HTML sonucunu üretir; bu nedenle önbelleğe almak çok etkilidir:
- Statik siteler ve dokümantasyon için derleme zamanında vurgulama yapın.
- Kullanıcı tarafından sağlanan veya veritabanında saklanan parçalar için oluşturulan HTML çıktısını (kod + seçeneklere göre anahtarlanmış olarak) önbelleğe alın ve kaynak değişene kadar yeniden kullanın.
Dilbilgisi ve tema önbelleklerinin çağrılar arasında paylaşılması için süreç içinde tek bir vurgulayıcıyı yeniden kullanın (Shikiphp arayüzü bunu sizin için yapar).