Tumblr’da PHP 7

ekip:

Tumblr olarak, sitemizin performansını iyileştirmek için sürekli yeni yollar arayışındayız. Yoğunlukla kullanılan kodyollarına kaşe eklemek, yeni CDN yapılandırmalarını denemek ya da temel software’I yükseltmek gibi şeyler, bu yolların birkaçı mesela.

Yakın bir zamanda, ekipler arası çalışmalar yaparak web sunucumuzu PHP 5’ten PHP 7’e yükselttik. Bu iyileştirme projesi oldukça eğlenceli oldu ve bayağı hoş sonuçlar elde ettik. Bunları sizinle paylaşmak istedik.

Zaman Çizelgesi

Hepsi 2015 sonbaharında bir hack günü projesi olarak başladı. @oli ve @tray Tumblr’ı PHP 7 aday sürümlerinden birinde çalıştırdılar. Bu noktada çok sayıda PHP eklentisi, sürüm 7’de desteklenmiyordu ama elimizde resmi olmayan ve oldukça deneysel yöntemlerle destek veren birkaç kaynak vardı. Sonuç olarak, her türlü karmaşaya rağmen Tumblr’ı sürüm 7’de çalıştırılabildi.
Geçtiğimiz bahar, durum biraz daha dengeye oturunca sistemi yükseltmeyi daha yakından incelemeye başladık. Yaptığımız ilk şeylerden biri, bu yeni sürümü – kurumu kolay ve  tutarlı olması için – güzelce paketlemek oldu. Aynı zamanda bizim yaptığımız eklentileri de bu sürüme ekledik ve herşey hazırlanmış oldu.
Geliştiricinin sunucusunu yükeseltecek (ya da indirecek) küçük bir skript yazıldı. İlkbahar sonu ve yaz boyunca testler yapıldı. PHP paketleri tekrar tekrar çalıştırıldı, performansı ölçüldü ve değerlendirmeden geçirildi. Bu sistem de dengeye oturdukça ekibimizden daha fazla geliştirici bu sistemi PHP 7 yürütebilen cihazlarında günlük şekilde kullanmaya başladı.
Ağustos sonuna geldiğimizde, test sonuçlarımıza olan güvenimizle, PHP 7’yi yayımladık ve produksiyon sunucularımızın küçük bir kesiminde kullanmaya başladık. İki hafta sonra ise, kullanıcı taleplerini karşılayan bütün sunucularımızı bu şekilde güncelledik!

Test

Bunun gibi sistem yükseltmeleri yaparken, kodların aynı şekilde işlevselliğine devam ettiğini kontrol etmek için birkaç farklı yaklaşımımız oldu.
Phan. Bu projede kendisini, kod merkezimizde PHP 7 ile uyumlu olmayan kodları bulmak için kullandık. Bu kodları bulup, hataları düzeltmek bu şekilde kolaylaşmış oldu.
Evvelden düzgün çalışan ancak işlevinde bozukluk çıkmış olan kodları bulmak için birim ve entegresyon testleri de uyguladık. Bir yandan da normal geliştirme projeleri de devam ettiğinden, yeni oluşturulmuş bütün kodların PHP 7’de çalışabilir olduğuna da emin olmak için CI görevlerini hem PHP 5 hem de PHP 7’de test ettik.

Sonuçlar

Bu çalışmanın sonuçları ne oldu peki? İki önemli sonuçtan bahsedebiliriz: Performans ve dil özelliklerindeki kayda değer iyileşimler.

Performans

İlk grup sunucumuzda PHP 7’yi etkinleştirdiğimizde, farklı parametreleri yakından takip edip herşeyin düzgün gidip gitmediğini inceledik. Performansta iyileşim bekliyorduk ancak pratikte gördüğümüz sonuçlar beklediğimizin üstündeydi. Gecikme neredeyse anında yarıya inmişti ve sunuculardaki CPU yükü en az %50 azalmıştı. Sayfalardan sorumlu sunucularımız sadece iki katı hızlı çalışmıyor yetinmiyor, bunu CPU kaynaklarının yalnızca yarısını kullanarak yapıyorlardı.

image
image

Bu grafikler, API’ımızı çalıştıran sunucularımızdan birinden. Gördüğünüz gibi gecikme kendi yarısından aza düşerken, en yüksek yük ortalaması evvelki en düşük yük ortalamasından daha az hale geldi!

Dil özellikleri

PHP Tumblr geliştiricilerinin hayatını biraz daha kolaylaştıran yeni özellikleri de beraberinde getirdi. Örnek olarak;

• Skaler yazı ipuçları: PHP geçmişinde yazı güvenliği konusunda zayıf kaldığını birkaç defa gösterdi. PHP 7’de ise belli tiplere (string, bool, int, float gibi..) uyumlu değerler gösteren skaler yazı ipuçlaru içeriyor.
• Dönüş tipi dayatmaları: PHP 7 ile, fonksiyonlar artık kullanılan dilin uyguladığı özel dönüş tipi dayatmalarına sahip olabiliyorlar. Bu durum ise, ortak koda olan ihtiyacı ve fonksiyonların dönüşlerini manuel olarak kontrol etme ihtiyacını azaltıyor.
• Anonim sınıflar: Anonim fonksiyonlarda olduğu gibi, anonim sınıflar da belirli bir çalışma zamanında işleme konuluyor ve arabirimler, diğer sınıflara kadar yayılabilmek üzere, başka bir sınıfı da harekete geçirebiliyor. Bu durum, logging sınıfları gibi faydalı nesnelerde ve birim testlerinde oldukça işe yarıyor.
• Yukarıda bahsedilen noktaların dışında, genel olarak birçok farklı güvenlik ve performans iyileştirmelerini de bu listeye ekleyebiliriz.

Özet

PHP 7 bayağı çılgın bir şey yani!