İçeriğe geç
PHP-FPM

PHP-FPM (FastCGI Process Manager); PHP’nin resmi olarak sunduğu, yüksek trafikli uygulamalar için geliştirilmiş process yöneticisidir. Nginx + PHP-FPM ikilisi, modern LAMP/LEMP yığınının de facto standardıdır: WordPress, Laravel, Magento, Nextcloud ve bunlar gibi PHP tabanlı tüm kurumsal uygulamalar bu kombinasyonla çalışır.

PHP-FPM’in en güçlü özelliği pool modelidir: tek sunucuda farklı uygulamalar (veya farklı müşteriler) için ayrı worker havuzları, ayrı kullanıcılar ve ayrı kaynak limitleri tanımlanabilir. Bir uygulamanın bellek sızıntısı diğerini etkilemez.

Mono’nun yaklaşımı

  • PHP sürümü: PHP 8.2 veya 8.3 (güncel stable); eski projelerde PHP 7.4 ayrı pool ile izole.
  • pm modu: dynamic - pm.min_spare_servers, pm.max_spare_servers, pm.max_children yük testine göre kalibre.
  • OPcache: Her zaman etkin; validate_timestamps=0 production’da, deploy hook’unda opcache_reset().
  • Slow log: request_slowlog_timeout = 5s; yavaş endpoint tespiti için /var/log/php-fpm/slow.log.
  • Güvenlik: cgi.fix_pathinfo=0; her pool kendi sistem kullanıcısıyla çalışır (www-data yerine uygulama-spesifik).
  • Unix socket: TCP port yerine Unix socket (/run/php/phpX.Y-fpm.sock) - loopback overhead’ı sıfır.

Tipik Nginx + PHP-FPM yapılandırması

location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_read_timeout 60;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
}

Yaygın sorunlar ve çözümler

  • 502 Bad Gateway: PHP-FPM servisi düşmüş ya da socket yolu yanlış. systemctl status php8.3-fpm ve socket yolunu doğrula.
  • “max_children reached” uyarısı: pm.max_children yetersiz veya bir request sızdırıyor. Slow log ile uzun süren request’i bul; max_children artırmadan önce nedeni çöz.
  • Bellek tükenmesi: OPcache memory_consumption yetersiz (opcache.memory_exhausted istatistiklerde görünür) veya process başına bellek fazla. pm.max_requests ile periyodik worker yenileme yap.
  • Yavaş uygulama (PHP tarafı değil): fastcgi_read_timeout çok düşük; backend DB sorgusu uzun. Slow log ile ayırt et.
  • Session çakışması çok-pool ortamında: Her pool için ayrı session.save_path tanımla.

İlgili hizmetlerimiz

Sıkça sorulan sorular

mod_php ile PHP-FPM farkı nedir?
mod_php Apache’nin içinde çalışır; her Apache worker bir PHP yorumlayıcısı taşır - bellek açısından pahalı ve Apache’ye kilitli. PHP-FPM bağımsız bir process manager’dır; Nginx, Caddy veya herhangi bir FastCGI destekleyen sunucuyla çalışır. Pool başına kullanıcı, PHP sürümü ve kaynak limiti tanımlanabilir - bu çok-kiracılı ortamlarda kritik avantajdır.
pm.max_children nasıl hesaplanır?
Formül: (Kullanılabilir RAM) / (Ortalama PHP process RAM). Örneğin 8 GB RAM’den 2 GB OS/diğer servislere ayrıldıktan sonra 6 GB kalıyor; ortalama PHP process 64 MB ise max_children = 6144 / 64 = ~96. Ortalama process RAM’i ps --no-headers -o rss -C php-fpm ile ölçülür. Mono bu değeri deployment öncesi yük testinde kalibre eder.
pm modu olarak ne seçmeliyiz?
dynamic çoğu production için dengeli seçim - min/max arasında talebe göre fork. static yüksek ve sabit trafikte fork overhead’ını sıfırlar. ondemand düşük trafikli / çok kiracılı sunucularda bellek tasarrufu sağlar ama cold-start gecikme yaratır. Mono production’da genellikle dynamic kullanır.
OPcache ile PHP-FPM birlikte nasıl çalışır?
OPcache, PHP dosyalarını parse edilmiş bytecode olarak shared memory’de saklar; aynı worker pool içindeki tüm child process’ler bu cache’i paylaşır. Mono standart yapılandırması: opcache.memory_consumption=256, opcache.max_accelerated_files=20000, opcache.validate_timestamps=0 (production’da; deploy sırasında opcache_reset()).

Bir sonraki dönüşümü birlikte planlayalım.

Ekibimiz teknik gereksinimlerinizi anlamak ve hızlıca prototip çıkarmak için hazır.

Bir sonraki dönüşümü birlikte planlayalım.

Ekibimiz teknik gereksinimlerinizi anlamak ve hızlıca prototip çıkarmak için hazır.