Php 5.5 Opcache Nedir? (ve overflow problemi)

Opcache Nedir?

PHP 5.5 üzerinde hazır halde gelen opcache temel olarak, filesystem üzerinde bulunan php dosyalarını her requestte okumamak için tasarlanmış bir otomatik low level cache mekanizmasıdır. Php nin 5.5 sürümünü kullanıyorsanız, ve özellikle kapatmadıysanız, muhtemelen siz de bu özelliği kullanabilirsiniz / veya zaten bilmeden kullanıyorsunuzdur.

PHP interpreted bir dil olduğu için, (yazılan kodlar, çalışma anında makine diline çevrildiğinden) ilgili dosyalar normalde her çalıştırdığınızda veya sitenize her request geldiğinizde tekrar tekrar bu dosyaları load eder. Düşünün bir siteniz var ve anasayfasını ekrana basmak için 10 adet php dosyasına ihtiyacınız var. Sitenize de aynı anda(örneğin 1 saniye içinde) 100 kişi giriyor. Opcache olmadığında, bu 10 dosyayı her 100 giriş için toplamda diskten 1000 kere okuma işlemi yapması gerekiyor. Halbuki opcache üzerinde bir ayar ile bir dosyayı okuduğunda 10 saniye boyunca cachelemesini belirtebilirsinz. Bu demektir ki, 100 kişi x 10 saniye x 10 dosya = sisteminizin 10.000 kere okuma yapması gereken halde, sadece 10 kere diskten okuma işlemi yapacaksınız. Tabi, yapacağınız bir dosya değişikliğinin sitenize yansıması için bu sefer 10 saniye beklemek zorunda kalacağınızı da hatırlatmak isteriz.

Default değerleri görebileceğiniz tüm opcacahe konfigürasyon listesi için buyrunuz : http://php.net/manual/en/opcache.configuration.php

Opcache ile tam olarak ne kazandık? 

Tam olarak io kazandık, (diskten okuma yapma işlemlerimizi, sitemizin yoğunluğuna göre %100 e yaklaşan bir değere kadar azaltabiliriz.)

Dezavantajları neler?

Developer ortamında, insan bir şeyi denerken hemen dosyayı kaydedip yaptığı değişikliği anında  görmek isteyebilir. Hatta refleks olarak böyle davranır yazılımcılar. Bu durumda, local ortam için bir miktar handikap oluşturabilir, veya en güzeli, local ortam için opcache i disable etmek olabilir. (php.ini içinde opcache.enable=0 yazacaksınız) Aksi halde zırt pırt fpm restart etmek zorunda kalabilirsiniz.

Başka başka?

Opcache; büyük bir projede, aynı dosyalar ile çok fazla takıldıktan sonra, yazılımınızın yeni bir versiyonuna ait benzer sayıda çok dosya daha geldiğinde, ve artık bu dosyaları kullanmaya başladığında, sanırım eski dosyaları halen aklında tutmaya çalışmasından dolayı, yeni dosyalarınızı okurken io’su sanki opcache açık değilmişçesine artmaya ve overflow olmaya başlıyor. (bu da load vb konularında probleme sebebiyet verebiliyor. ). Çalışmamazlık durumu oluşmuyor ancak code ve dosya sayısı büyüklüğünüze göre sizi olumsuz etkiliyor. Bu noktada codebase üzerinde çok fazla değişme/yeni release yayına alma gibi aksiyonlarda php-fpm inizi restart etmenizde yarar var. (reload kurtarmıyor malesef)

PHP 5.5 yayinlandi – yeni ozellikler

20 haziran 2013 itibariyle php.net php 5.5‘in yayınlandığını duyurdu.

Yeni özellikler neler?

  • Üreticiler (generators) ve eşyordamlar (coroutines) eklendi. (yield komutu eklendi). basitçe bir metodda array’e toplayıp array’i return ettiğiniz işi yapmaktadır. Dönen değerler foreach ile gezilerek işlem yapılabilir. bkz : http://tr1.php.net/manual/tr/language.generators.syntax.php
  • Exceptionlar için finally özelliği eklendi. Artık Try – catch te bir exception oluşması durumunda dahi son bir iş yapabileceğimiz bloğumuz olacak. Özellikle kod okunabilirliğini çok artırmasını tahmin ediyoruz.
  • md5, sha1 gibi eskimiş şifre üretme algoritmaları yerine password_hash fonksiyonu eklendi. bkz : http://tr1.php.net/manual/tr/function.password-hash.php
  • Array dereferencing (arrayde değişkene atama zorunluluğunun kalkması)
  • empty() fonksiyonu artık parametre olarak metod da alabilmeye başladı. !!!
  • foreach içinde list kullanabileceğiz. Mesela : foreach ($arr as list($var1, $var2)){…
  • SinifAdi::class yazarak sinifin tam yol adını alabilmemiz artık mümkün! get_class() benzeri bir işlev bu da. Ancak tam adını veriyor.
  • Resim işleme kütüphanesi olan GD ye eklemeler yapıldı.
  • Windows XP ve 2003 desteği kaldırıldı. bu demektir ki, php 5.5 windows xp’lerde ve 2003’lerde çalışmayacak!

Tüm değişiklikleri http://php.net/ChangeLog-5.php#5.5.0 linkinden okuyabilirsiniz.