Yazılarımız

OfisData

PHP 8 PERFORMANS FARKLARINI ANLAMAK

PHP 8 mor logosu ile hız göstergesi ve 8.0 rozetinin JIT compiler performans sıçramasını temsil eden minimal kompozisyon

"PHP yavaş" lafı 2010'larda doğru olabilirdi; bugün artık değil. PHP 7'den 8'e geçişle birlikte dil hem performans hem syntax açısından önemli ölçüde olgunlaştı. Buna rağmen birçok proje hâlâ PHP 7.4 veya daha eski sürümlerle çalışıyor; performansı şikayet ediyor.

PHP 8 ile gelen JIT compiler, OPcache iyileştirmeleri, typed property'ler ve syntactic yenilikler hem yazılım hızını hem geliştirici verimliliğini artırıyor. Doğru kullanıldığında bir Laravel veya Symfony uygulaması yüzde 30-50 daha hızlı yanıt verebilir. Yanlış konfigüre edildiğinde ise PHP 7'den fark görünmez kalır.

Bu yazı PHP 8'in temel performans iyileştirmeleri, JIT compiler nasıl çalışır, OPcache'in doğru ayarı, typed property ve match expression'ın etkisi ve gerçek dünya uygulamalarına performans yansımaları üzerine.

PHP 8 Sürüm Tarihi

PHP 8.x ailesi:

  • PHP 8.0 (2020): JIT compiler ilk kez, named arguments, attributes, match expression, constructor property promotion.
  • PHP 8.1 (2021): Enums, readonly properties, never return type, first-class callable syntax, fiber.
  • PHP 8.2 (2022): Readonly classes, DNF types, new constants in traits.
  • PHP 8.3 (2023): Typed class constants, json_validate(), readonly amendments.
  • PHP 8.4 (2024): Property hooks, asymmetric visibility, new array_find functions, multibyte improvements.

Her sürüm önceki üzerine iyileştirme; PHP 8.2+ modern üretim ortamında tipik. PHP 7.4 EOL geçti, security güncellemesi almıyor; güvenlik açısından zorunlu yükseltme.

JIT Compiler — Just In Time Derleme

PHP klasik olarak interpreter'dı: kod sürekli yorumlanıyor, OPcode'a çevriliyor, çalıştırılıyor. PHP 8'le birlikte JIT compiler geldi: sık çağrılan kod parçaları doğrudan makine koduna derleniyor.

JIT performansa nasıl katkı sağlar:

  • CPU-yoğun işlemler: Matematiksel hesaplama, görüntü işleme, kompleks algoritma — 2-3 kat hızlanma.
  • Web request: Tipik PHP web isteği genelde I/O sınırlı (database query, file read). JIT katkısı %5-15 mertebesinde.
  • CLI uzun çalışan script: Batch işleme, data processing — anlamlı hızlanma.

JIT default'ta kapalıdır; php.ini'de etkinleştirilmesi gerekir. Bu yapılandırma direktiflerinin tam listesi ve geçerli değer aralıkları için resmi PHP el kitabı başvurulacak ilk kaynaktır:

opcache.jit_buffer_size=100M
opcache.jit=tracing

jit_buffer_size derlemiş kodun saklandığı bellek; 64M-256M tipik. jit modu: tracing (default önerilen), function, disable.

PHP 8 OPcache ve JIT compiler ayarlarının terminal benchmark çıktısında PHP 7 ile karşılaştırılması requests per second farkı görünüyor

JIT'in Sınırları

JIT her uygulamada büyük katkı yapmaz. Tipik web uygulamasının dar boğazları:

  • Database query (en büyük çoğu zaman)
  • Network call (external API)
  • File system I/O
  • Template rendering

JIT bu boğazları çözmez; CPU içinde geçen süreyi azaltır. Eğer uygulamanız zaten DB veya network bekliyorsa JIT %5'ten fazla katkı vermez. Bu durumda DB query optimizasyonu, cache, async I/O daha büyük kazanç sağlar.

JIT en çok fayda verdiği durumlar:

  • Math heavy: machine learning, simulation, data analysis.
  • Image processing: GD, Imagick işlemleri.
  • Cryptography ve hashing.
  • String manipulation yoğun parsing/encoding.
  • CLI script'ler, queue worker'lar.

OPcache — Her Zaman Açık

JIT'ten önce, en kritik performans aracı OPcache. PHP kodu her istekte yorumlanır; OPcache yorumlanmış OPcode'u bellekte saklar, sonraki istekler yeniden parse etmez.

OPcache aktif değilse production sunucu PHP gücünün yarısını kaybediyor demektir. Tipik konfigürasyon:

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0   ; production'da; dev'de 1
opcache.save_comments=1
opcache.fast_shutdown=1

Production'da validate_timestamps=0 ile dosya değişikliklerini her istekte kontrol etmemek %5-10 ek kazandırır. Tabii kod deploy ederken cache clear gerekir.

OPcache preloading (PHP 7.4+) bir adım daha: belirli dosyaları sunucu açılırken cache'e yükler. Laravel, Symfony gibi framework'ler için preload script'leri vardır.

Typed Properties

PHP 7.4 ile başlayan ve 8'de olgunlaşan typed property:

// Eski
class User {
    public $name;
    public $age;
}

// Modern
class User {
    public string $name;
    public int $age;
    public ?string $email = null;
}

Tip beyanları sadece dökümantasyon değil; runtime'da type check yapılır. Yanlış tip atanırsa exception fırlatılır. Performans açısından küçük bir overhead var ama:

  • Hata erken yakalanır.
  • IDE autocomplete daha doğru.
  • Static analysis (Psalm, PHPStan) daha güçlü.
  • Kod kendini belgeleyici hâle gelir.

Tip strict'liği için declare(strict_types=1); dosya başına eklenir; otomatik type juggling kapanır.

Constructor Property Promotion

PHP 8.0'la gelen kısaltma syntax'i:

// Eski
class User {
    private string $name;
    private int $age;

    public function __construct(string $name, int $age) {
        $this->name = $name;
        $this->age = $age;
    }
}

// PHP 8
class User {
    public function __construct(
        private string $name,
        private int $age,
    ) {}
}

Sadece kod sadeleşmesi; performansa direkt etkisi az. Ama okunabilirlik ve maintenance açısından büyük fark; boilerplate %50 azalır.

Match Expression

Switch'in yerine geçen daha güvenli alternatif:

// Switch
$result = '';
switch ($status) {
    case 'pending':
    case 'processing':
        $result = 'in-progress';
        break;
    case 'completed':
        $result = 'done';
        break;
    default:
        $result = 'unknown';
}

// Match
$result = match($status) {
    'pending', 'processing' => 'in-progress',
    'completed' => 'done',
    default => 'unknown',
};

Match avantajları:

  • Daha kısa
  • break gerekmez (otomatik)
  • Strict comparison (=== değil ==)
  • Default zorunlu (no match = UnhandledMatchError)
  • Doğrudan değer döndürür (expression)

Performans açısından switch ile aynı; ama kod kalitesi açısından modern PHP'nin standardı.

Named Arguments

Fonksiyon çağrılarında argümanları isimle geçme:

// Eski
htmlspecialchars($string, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);

// Named
htmlspecialchars(
    string: $string,
    flags: ENT_QUOTES | ENT_HTML5,
    encoding: 'UTF-8',
    double_encode: false,
);

Çok parametreli fonksiyonlarda hangi argümanın hangisi olduğunu netleştirir. PHP'nin bazı standart fonksiyonları absurd parametre sıralamasına sahip; named arguments bu okunabilirlik sorununu çözer.

Readonly Properties

PHP 8.1 ile gelen readonly:

class User {
    public function __construct(
        public readonly string $id,
        public readonly string $email,
    ) {}
}

$user = new User('123', 'a@b.com');
$user->email = 'x@y.com'; // Error

Readonly property bir kez set edilebilir (genelde constructor'da), sonra değiştirilemez. DTO (Data Transfer Object) ve immutable objeler için ideal.

PHP 8.2 ile gelen readonly class tüm property'leri otomatik readonly yapar; her birini ayrı yazmak gerekmez.

Enums

PHP 8.1 ile gelen native enum desteği:

enum Status: string {
    case Pending = 'pending';
    case Active = 'active';
    case Disabled = 'disabled';

    public function label(): string {
        return match($this) {
            self::Pending => 'Beklemede',
            self::Active => 'Aktif',
            self::Disabled => 'Pasif',
        };
    }
}

$status = Status::Active;
echo $status->label(); // Aktif
echo $status->value; // active

Constant string'ler yerine type-safe enum kullanmak; magic string'lerin yarattığı tipik bug'ları önler. Database alanı için backed enum (string veya int değer taşıyan); tip kontrolü hem DB'de hem PHP'de gerçek.

Fiber — Async PHP

PHP 8.1 ile gelen Fiber low-level concurrency primitive. Doğrudan kullanmak nadiren gerekir; ama altında çalışan framework'ler (ReactPHP, Amphp, Swoole alternatifleri) async PHP yazmayı kolaylaştırır.

Fiber'in pratik etkisi: bir HTTP server tek thread'de binlerce eşzamanlı bağlantıyı handle edebilir. Klasik PHP'de her istek ayrı process; Fiber ile event loop bazlı non-blocking I/O mümkün.

Tipik PHP web uygulaması için bu özellik geri planda; ama uzun çalışan API gateway, real-time uygulamalar için devrim niteliği taşıyor.

Property Hooks (PHP 8.4)

PHP 8.4 ile gelen en heyecan verici özellik:

class User {
    public string $name {
        get => ucfirst($this->name);
        set(string $value) => $this->name = strtolower($value);
    }
}

Magic __get ve __set yöntemleri yerine deklaratif property hook'ları. Daha hızlı, daha okunabilir, IDE destekli. Eskiden getter/setter yazılan birçok pattern artık daha kısa.

PHP 8.1 readonly enum match expression ve constructor property promotion modern syntax örneklerinin yan yana eski PHP 7 kod ile karşılaştırılması

Sürüm Yükseltme Stratejisi

PHP 7 veya eski sürümden 8'e geçiş için disiplin:

  1. Statik analiz: PHPStan veya Psalm ile incompatibility'leri tespit et.
  2. Automated refactoring: Rector kütüphanesi PHP'yi modern syntax'a otomatik çevirir.
  3. Aşamalı geçiş: Önce dev/staging ortamında, sonra production. Bir kerede tüm sürümleri atlamak (7.0 → 8.3) risk.
  4. Bağımlılık güncelleme: Composer paketleri PHP 8 uyumlu olmalı; eski paketler güncellenmemişse alternatif aranır.
  5. Test coverage: İyi test coverage olmayan kod base'i upgrade çok riskli. Önce test yazılır, sonra upgrade.

Laravel, Symfony, WordPress modern sürümleri PHP 8.x destekler. Eski versiyonlu CMS'lerde plugin uyumsuzluk olabilir; vendor-by-vendor kontrol gerekir.

Gerçek Dünya Performans Etkileri

Tipik PHP web uygulamalarında PHP 7.4 → PHP 8.3 geçişin performans etkisi:

Uygulama TipiTipik Hızlanma
WordPress sade blog%10-20
WooCommerce e-ticaret%15-25
Laravel API backend%20-35
Symfony heavy app%20-30
CPU-bound batch script%50-200 (JIT ile)
I/O-bound microservice%5-15

Bu rakamlar OPcache açık ve doğru konfigüre edilmiş durumlardan. OPcache kapalıysa veya yanlış ayarlıysa fark daha düşük olabilir.

Yazılım eğitimi içeriklerinde PHP geliştirme, modern syntax ve performans optimizasyonu pratik anlatılır.

Performans Profiling Araçları

PHP uygulamasında darbağaz analizi için:

  • Xdebug profiler: Development ortamında detaylı çağrı grafiği.
  • Blackfire.io: Production-grade profiling; düşük overhead.
  • Tideways: Continuous monitoring ve profiling.
  • New Relic / Datadog APM: Tüm stack izleme; PHP dahil.
  • php-fpm slow log: Yavaş istekleri yakalama.

Profiling olmadan optimizasyon tahmindir. Hangi fonksiyonun ne kadar süre aldığını, hangi DB query'sinin yavaşlattığını ölçtüktan sonra hedefli iyileştirme yapılır. "Önce ölç, sonra optimize et" mühendislik kuralı.

Çıkarımlar

PHP 8 sadece syntax yenilikleri değil; performans, type safety ve modern dil özellikleri açısından önemli bir sıçrama. Eski projeler PHP 8'e yükseltildiğinde donanım eklemeden yüzde 20-30 performans kazanır; geliştirme süreci de güvenli ve hızlı hâle gelir.

"PHP yavaş" söylemi 2020'lerin başında geride kalmıştır. Modern PHP, doğru kullanıldığında Java veya Go gibi enterprise dillerle yarışabilen bir araçtır. Sürüm yükseltmek, OPcache'i doğru ayarlamak ve modern syntax'ı benimsemek; bir PHP projesinin ömrünü ve performansını yeniden tanımlar.

 Vimaj