Zend OPcache: kavramı, kurulumu ve ayarları, php.ini değerleri ve JIT'in devre dışı bırakılması
Zend OPcache, PHP betiklerini bayt koduna derleyip paylaşımlı bellekte saklayan ve aynı dosya yeniden çalıştırıldığında derlemenin atlanmasını sağlayan bir PHP eklentisidir. PHP 8.3 kullanan bir WordPress sunucusunda JIT etkinleştirildikten sonra tüm sayfalarda 500 hatası çıkınca, OPcache olduğu gibi bırakılıp yalnızca JIT devre dışı bırakılarak sunucu düzeltildi.
PHP 5.5'ten itibaren OPcache, PHP ile birlikte varsayılan olarak dağıtılır.
1️⃣ Zend OPcache kavramı: bayt kodu önbellekleme
Bir PHP betiği, her istek geldiğinde dosyayı okuma, bayt koduna derleme ve çalıştırma olmak üzere üç aşamadan geçer. OPcache çalışırken aynı dosyaya gelen ikinci istekten itibaren ilk iki aşama atlanır ve yalnızca çalıştırma kalır.
OPcache'in bayt kodunu sakladığı paylaşımlı belleği PHP-FPM'in tüm worker'ları birlikte kullanır. Aynı PHP-FPM'e bağlı birden çok site varsa bu sitelerin betikleri de tek bir paylaşımlı bellekte saklanır.
OPcache'in sakladığı şey derlenmiş PHP kodudur; bu yüzden bir sayfa her açıldığında PHP'nin çalıştırılması ve veritabanı sorguları yine olur. Hazır HTML'yi saklayarak PHP'nin çalıştırılmasını tümüyle atlamak sayfa önbelleğinin işidir.
2️⃣ PHP OPcache kurulumunu denetleme
OPcache'in kurulu olup olmadığını [php -v] çıktısının son satırından anlarsınız.
php -vPHP 8.3.22 (cli) (built: Jun 3 2025 17:17:57) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.3.22, Copyright (c) Zend Technologies
with Zend OPcache v8.3.22, Copyright (c), by Zend TechnologiesSon satır yoksa dnf ile kurun. Paket adı genellikle php-opcache'tir; Remi deposundan birden çok PHP sürümünü birlikte kurduysanız php83-php-opcache örneğindeki gibi sürüm numarası eklenir.
dnf -y install php-opcacheRemi deposundaki php-opcache paketi, eklentiyi [/etc/php.d/10-opcache.ini] dosyasındaki [zend_extension=opcache] satırıyla yükler. Kurulumdan sonra PHP-FPM'i yeniden başlatırsanız OPcache web isteklerine de uygulanır.
3️⃣ OPcache ayarları: php.ini değerleri
OPcache ayarları iki yerde bulunabilir: [/etc/php.ini] dosyasının [opcache] bölümü ve [/etc/php.d/10-opcache.ini].
php --iniConfiguration File (php.ini) Path: /etc
Loaded Configuration File: /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed: /etc/php.d/10-opcache.ini,php.d klasöründeki dosyalar php.ini'den sonra okunur; bu yüzden aynı girdiyi iki yere yazarsanız php.d'deki değer geçerli olur.
Aşağıdaki tablo PHP 8.3'ün varsayılan değerlerini ve incelenen WordPress sunucusunda uygulanan değerleri gösterir.
| Öğe | PHP 8.3 varsayılanı | Uygulanan değer | Anlamı |
|---|---|---|---|
| opcache.enable | 1 | 1 | OPcache'i kullanır |
| opcache.enable_cli | 0 | 1 | Komut satırındaki PHP'de de kullanılır (wp-cli vb.) |
| opcache.memory_consumption | 128 | 1024 | Bayt kodunu saklayan paylaşımlı bellek (MB) |
| opcache.interned_strings_buffer | 8 | 16 | Aynı dizeyi yalnızca bir kez saklayan bellek (MB) |
| opcache.max_accelerated_files | 10000 | 10000 | Önbelleğe alınabilecek anahtar sayısının üst sınırı (gerçek sınır bu değerden büyük veya eşit bir asal sayıdır: 10000 için 16229) |
| opcache.max_wasted_percentage | 5 | 10 | Bellek yetmez ve boşa giden alan bu oranı aşarsa önbellek boşaltılıp yeniden başlatılır |
| opcache.validate_timestamps | 1 | 1 | Dosyaların değişip değişmediğini denetler |
| opcache.revalidate_freq | 2 | 60 | Dosya değişikliklerinin denetlenme aralığı (saniye) |
| opcache.jit | tracing | disable | JIT yöntemi (PHP 8.4'ten itibaren varsayılan disable) |
| opcache.jit_buffer_size | 0 | 0 | JIT belleği; 0 ise JIT çalışmaz (PHP 8.4'ten itibaren varsayılan 64M) |
[/etc/php.ini] dosyasının [opcache] bölümüne konan değerler aşağıdadır. Bellek boyutu sunucunun belleğine, [opcache.max_accelerated_files] ise WordPress dosyalarının sayısına göre belirlenir.
[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=1024
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.max_wasted_percentage=10
opcache.validate_timestamps=1
opcache.revalidate_freq=60php.ini'ye [zend_extension] satırını yeniden eklerseniz eklenti iki kez yüklenir ve [Cannot load Zend OPcache] uyarısı çıkar.
[opcache.revalidate_freq] 60 ise bir PHP dosyasını değiştirdikten sonra en fazla 60 saniye boyunca eski kod çalışabilir.
PHP dosyalarının sık değiştiği bir WordPress sunucusunda dosya değişikliklerinin denetlenmesi için [opcache.validate_timestamps] değerini 1 bırakın. Symfony belgelerinin üretim sunucuları için önerdiği 0, PHP dosyalarının yalnızca yeni sürüm dağıtılırken değiştiği sunuculara uygun bir değerdir.
[opcache.validate_timestamps] 0 olsa bile yönetim ekranından güncelleme yaptığınızda WordPress değişen dosyaların önbelleğini kendisi temizler. Ancak wp-cli ile güncelleme yapar veya dosyaları SSH ile değiştirirseniz PHP-FPM yeniden başlatılana kadar eski kod çalışır.
4️⃣ OPcache JIT'ini devre dışı bırakma
PHP 8'in JIT'i, işlemciyi çok kullanan işleri hızlandıran bir özelliktir; bu yüzden web isteklerini işleyen WordPress gibi bir uygulamada etkisi küçüktür. PHP JIT RFC'sinde yayımlanan WordPress ölçümünde de JIT etkin olan çalıştırma saniyede 326 istek, JIT devre dışı olan çalıştırma 315 istek işledi.
PHP 8.3.22 kullanan bir WordPress sunucusunda [opcache.jit=tracing] ve [opcache.jit_buffer_size=128M] ile JIT etkinleştirildi. Üç gün sonra, isteklerin yığıldığı ve PHP-FPM worker'larının birkaç kez yeniden başladığı bir günde tüm sayfalarda 500 hatası oluştu.
Hata kaydında [Allowed memory size of 1073741824 bytes exhausted] iletisi kaldı. Ardından gelen [tried to allocate 4295229440 bytes], 1 GB'lık PHP bellek sınırında bir seferde 4 GB ayırmaya çalışıldığını gösteren kayıttır. JIT devre dışı bırakılınca aynı istekler sorunsuz işlendi.
JIT, aşağıdaki iki satırı [/etc/php.d/10-opcache.ini] dosyasına koyarak devre dışı bırakılır. [/etc/php.ini] dosyasında JIT ayarları kalmış olsa bile bu dosyadaki değerler geçerli olur.
opcache.jit=disable
opcache.jit_buffer_size=0PHP 8.3'te [opcache.jit_buffer_size] varsayılanı 0'dır; ayrıca ayarlamazsanız JIT çalışmaz. PHP 8.4'ten itibaren [opcache.jit] varsayılanı da disable'dır.
5️⃣ Ayarları uygulama ve doğrulama
Değiştirilen ayarlar yalnızca PHP-FPM yeniden başlatıldığında uygulanır.
systemctl restart php-fpmYeniden başlatınca OPcache paylaşımlı belleği boşaltılır ve yeni ayarlarla yeniden ayrılır.
php -i | grep -E '^opcache\.(enable|memory_consumption|revalidate_freq|validate_timestamps|jit) 'opcache.enable => On => On
opcache.jit => disable => disable
opcache.memory_consumption => 1024 => 1024
opcache.revalidate_freq => 60 => 60
opcache.validate_timestamps => On => On[php -i] komutunun çıktısındaki değerler komut satırındaki PHP'nin ayarlarıdır. RHEL ailesinde PHP-FPM de aynı [/etc/php.ini] ve [/etc/php.d] dosyalarını okur; bu yüzden değerler aynıdır.
Komut satırında [opcache_get_status()] çağırırsanız önbellekteki betik sayısı 0 çıkar. Komut satırındaki PHP her çalışmada paylaşımlı belleği yeniden oluşturur; bu yüzden PHP-FPM'in kullanımı, aşağıdaki dosyayı web belge klasörüne koyup tarayıcıdan açarak denetlenir.
<?php
header('Content-Type: text/plain');
$s = opcache_get_status(false);
print_r($s['memory_usage']);
print_r($s['opcache_statistics']);
print_r($s['interned_strings_usage']);
var_dump($s['cache_full']);[cache_full] true ise paylaşımlı bellek veya anahtarlar dolmuştur. Denetledikten sonra bu dosyayı hemen silin.
Üç WordPress sitesinin aynı PHP-FPM'i kullandığı bir sunucuda 1024 MB paylaşımlı belleğin 317 MB'ı kullanılıyordu. Önbellekteki betik sayısı site başına 3.366 ile 4.222 arasındaydı; toplam 11.358'di.
OPcache betikleri gerçek yoluyla saklar, göreli yolla yüklenen dosyalar için çalışma dizini eklenmiş bir anahtar daha oluşturur; bu yüzden anahtar sayısı betik sayısından fazla olur. 11.358 betikte anahtarlar 16.229'luk sınırı doldurdu ve 16 MB'lık dize arabelleğinde de boş yer kalmadı.
Anahtarlar dolunca yeni betikler önbelleğe alınmaz ve her istekte derlenir. 5 dakika 21 saniye içinde önbellek ıskaları 18.408'den 36.027'ye çıktı, ancak önbellekteki betik sayısı 11.358'de kaldı.
Birden çok WordPress çalıştıran veya çok sayıda eklentisi olan bir sunucuda [opcache.max_accelerated_files] değerini, anahtar sınırı dolmayacak şekilde bol tutun. 20000 yaparsanız gerçek anahtar sınırı 32.531 olur. Dize arabelleği dolmuşsa [opcache.interned_strings_buffer] değerini de birlikte artırın.
🔢 SSS & önerilen içerikler
Önbellek
Önbellek: tanımı ve önbelleğe almanın kullanıldığı tüm alanlar
Derlenmiş PHP kodunu saklayan OPcache ile hazır HTML'yi saklayan sayfa önbelleği dahil, önbelleklerin kullanıldığı alanları ayıran bir yazıdır.
PHP-FPM
php-fpm max_children uyarısı: Worker artırmadan önce nedeni kayıtlardan bulun
OPcache'in paylaşımlı belleğini birlikte kullanan PHP-FPM worker'ları dolduğunda çıkan uyarının nedenini kayıtlardan ayırt etmeyi anlatan bir yazıdır.
PHP-FPM
PHP-FPM nedir | PHP-FPM kurulumu ve ayarları
OPcache'in içinde çalıştığı PHP-FPM'in kurulumunu, www.conf havuz ayarlarını ve yeniden başlatma yöntemini anlatan bir yazıdır.
ℹ️ Satış ortaklığı bildirimi
Bu sitenin içeriklerinde satış ortaklığı bağlantıları bulunur. Bir ziyaretçi bu bağlantılar üzerinden ürün veya hizmet satın alırsa bu site satıcıdan komisyon alır. Bu süreçte alıcının ödediği tutar (kampanya indirimlerinde tutar düşer↓) artmaz. Yayımlanan fiyat, indirim ve stok bilgileri yazının yazıldığı zamana aittir ve gerçek durumdan farklı olabilir; bu yüzden satın almadan önce son bilgiyi satıcıdan kontrol etmenizi rica ederiz. Ürünler kendi ölçütlerimize göre seçilir ve değerlendirilir; komisyon alınıp alınmaması tanıtım sırasını veya değerlendirme içeriğini etkilemez.