2-legged OAuth PHP İmplementasyonu

Şirket içinde geliştirilen bir uygulamaya hem web’den hem de native mobile uygulamalardan erişilmesi planlanmaktaydı. O nedenle API-Centric bir uygulama yapıp, tüm client’ların bu API üzerinden işlemlerini gerçekleştirmesine karar verdik. Güvenlik katmanında da 2-legged OAuth kullanmaktayız. Normal OAuth kullanımından farklı olarak 2-legged OAuth’da ziyaretçinin (resource owner) API’ye (source) izin vermesi gerekmiyor çünkü API’yi sadece kendi güvenilir client’ların (consumer) kullanması amaçlanıyor, bu nedenle uygulamaya ait client’ın yine kendisine ait API’yi kullanmak için izin alması gereksiz oluyor.
Continue reading 2-legged OAuth PHP İmplementasyonu

Amazon EC2 üzerine LAMP Ortamı Kurulumu

Popüler cloud servisi Amazon EC2 üzerine, PHP uygulamalarını çalıştırabilmek için gerekli araçları kuralım.

Öncelikle AWS Management Console‘dan EC2 sayfasına girip Launch Instance butonuna basarak ihtiyaca göre bir adet instance açıyoruz. Classic Wizard‘ı kullanıp CHOOSE AN AMI aşamasında Ubuntu Server 14.04 LTS‘i seçip (64 bit) devam ediyoruz. Create Key Pair aşamasında yeni bir keypair oluşturup kaydetmeyi unutmayın. Bu keypair SSH ile sunucumuza bağlanmak için lazım olacak.

Kurulum bittikten sonra EC2 Dashboard’da, NETWORK & SECURITY menüsü altında Elastic IPs sayfasına giriyoruz. Buradan Allocate New Address butonuna basıp yeni bir IP alıyoruz. Daha sonra bu IP’nin üzerine tıklayıp Associate Address butonuna basarak biraz önce oluşturduğumuz instance ile ilişkilendiriyoruz. Böylece instance’ımıza bir adet IP bağlamış olduk. Yine NETWORK & SECURITY menüsü altından Security Group sayfasına girip HTTP portunu (80) açmamız gerekiyor. Kullandığınız security group’un üzerine tıklayıp Inbound tab’ından HTTP rule’unu eklemeniz ve kaydetmeniz yeterli.

Şimdi keypair ile EC2 sunucumuza ubuntu kullanıcısı ile bağlanalım (önce keypair dosya modunu güvenlik nedeniyle 600 yapıyoruz):
Continue reading Amazon EC2 üzerine LAMP Ortamı Kurulumu

Jenkins ile Git Kullanarak Deployment

Şöyle bir deployment akışımız olduğunu varsayalım:

  • Local ortamda projeyi ‘develop‘ branch’ında geliştiriyoruz.
  • Production’a bir release çıkmak istendiğinde develop branch’ını ‘master‘ branch’ı ile merge edip Github’a push’luyoruz.
  • Github’a güncelleme geldiğinde Jenkins tetikleniyor.
  • Jenkins build task’ini çalıştırıyor.
  • Eğer build başarılıysa Jenkins, görevi pruduction kodunu güncellemek olan başka bir işi çalıştırıyor.

Continue reading Jenkins ile Git Kullanarak Deployment

PHP Projelerinde Jenkins Kullanımı

Eğer projelerinizde unit test yazıyorsanız ve özellikle projede birden fazla developer çalışıyorsa Jenkins gibi bir continuous integration (CI) aracı kullanmanız tavsiye ediliyor. Martin Fowler’in CI tanımı şu şekilde (çeviri Özcan Acar):

Sürekli Entegrasyon, programcı ekibi tarafından yapılan değişikliklerin sık aralıklarla sisteme entegre edilmesi için kullanılan yazılım geliştirme yöntemidir. Her programcı günde en az bir kere yaptığı değişiklikleri entegre eder. Bu sayede gün boyunca birden fazla entegrasyon gerçekleşir. Otomatik sürüm oluşturulması ve mevcut testler yardımı ile entegrasyon kontrol edilir. Birçok ekip tarafından sürekli entegrasyon metodu ile entegrasyon sorunlarının azaldığı tespit edilmiştir. Sürekli entegrasyon ile bir ekip hızlı bir şekilde kendi içinde bütün ve çalışır programlar yazabilmektedirler.

PHPUnit‘in geliştiricisi Sebastian Bergmann abimiz PHP projelerinde kullanmak üzere şahane bir Jenkins template’i hazırlamış (Template for Jenkins Jobs for PHP Projects). Bu template ve extension’lar sayesinde PHP projeleri için; syntax hatalarının tespiti, uygulama içinde kod tekrarı yapılıp yapılmadığı, unit-test sonucu code coverage durumu gibi bir çok kontrol ve rapor paketi sunuyor.

(Kuruluma başlamadan önce Apache Ant’ın ve Jenkins’in kurulu ve çalışıyor olduğundan emin olun)

Öncelikle PHP araçlarını kuralım:
Continue reading PHP Projelerinde Jenkins Kullanımı

PHP Optimizasyon İpuçları

  • echo fonksiyonu print‘den daha hızlıdır (alıntı)
  • Eğer sadece bir string çıktısı verecekseniz tek tırnak kullanın. Çünkü çift tırnak kullandığınızda derleyici öncelikle içinde değişken ya da özel karakter arayacaktır (alıntı)
  • Değişkenleri yazdırmak için tırnaklarla ayırmak yerine sprintf() kullanın, 10 kat kadar daha hızlıdır (alıntı)
  • Sıralanmış string yerine birden fazla parametreli echo kullanın (alıntı)
  • Döngü kontrolü içinde fonksiyon kullanmaktan kaçının. Çünkü döngü her bir iterasyonda o fonksiyonu çalıştırıp zaman kaybedecektir (alıntı)

    Yanlış örnek:

    for ($i = 0; $i < count($array); $i++) {
    	//stuff
    }

    Doğru örnek:

    $count = count($array);
    for($i = 0; $i < $count; $i++) {
    	//stuff
    }
  • Büyük veri setlerini tuttuğunuz değişkenleri kullandıktan sonra bellekte yer açmak için unset() edin ya da null’a eşitleyin (alıntı)
  • __get, __set, __autoload gibi bazı sihirli metotları gerekmedikçe kullanmaktan kaçının (alıntı)
  • Mümkün olduğu sürece require_once() yerine require() kullanın (alıntı)
  • include() ve require() fonksiyonları ile beraber full path (tam dosya yolu) kullanın ki derleyici doğru yolu bulmak için zaman kaybetmesin (alıntı)
  • str_replace() fonksiyonu preg_replace()‘den daha hızlıdır. Ama bazı büyük veri setlerinde strtr() daha iyi sonuç verebilir
  • else if‘ yapısı switch-case yapısından daha hızlıdır (alıntı)
  • @ ile hata gösterimi engelleme çok yavaştır (alıntı)
  • Bandwidth kullanımını düşürmek için Apache v2’de mod_deflate‘i açın (alıntı) ya da Apache v1 için mod_gzip‘i deneyin (alıntı)
  • İşiniz bittiğinde veritabanı bağlantınızı kapatın (alıntı)
  • $row[‘id’] şeklinde kullanım, $row[id] kullanımından 7 kat daha hızlıdır. Çünkü ikinci kullanımda derleyici sabit kontrolü de yapacaktır (alıntı)
  • Short open tag (< ? ) yerine standart tagı < ?php ... ? > kullanın (alıntı)
  • PHP script’leri cache’lenmedikleri sürece her çalıştırdıklarında tekrar derlenirler. Performansı artttırmak için PHP cacheleme ürünleri kullanın (APC, eAccelerator, Turck MMCache vb.)
  • strlen() yerine isset() kullanın.

    Kötü örnek:

    if (strlen($foo) < 5) { 
    	echo "Foo is too short"; 
    }
    

    İyi örnek:

    if (!isset($foo[5])) { 
    	echo "Foo is too short"; 
    }
    

    (alıntı)

  • Eğer yerli bir PHP fonksiyonu varsa kendi fonksiyonunuzu yazmak yerine onu kullanın, çünkü o daha hızlıdır. Eğer fazla kaynak tüketen bir fonksiyon ise C eklentisi ya da modül yazın (alıntı)
  • Xdebug debugger gibi profiler kullanın. Böylece kodunuzun hangi kısımları ne kadar zaman alıyor, ne kadar kaynak tüketiyor takip edebilirsiniz (alıntı)
  • Kodunuzla ilgili döküman yazın (alıntı)
  • İyi kod ile kötü kod arasındaki farkı öğrenin (alıntı)
  • Kod standartları kullanmak hem sizin başkalarının kodlarını anlamınızı hem de başkalarının sizin kodunuzu anlamalarını kolaylaştırır (alıntı)
  • Yerel bir değişkeni arttırmak, sınıf içindeki bir özelliği arttırmaktan (örn. $this->prop++) 3 kat daha hızlıdır (alıntı)
  • Her şey nesne olmak zorunda değildir. Gerekmiyorsa kullanmayın (alıntı)

Kaynak: http://www.hm2k.com/posts/50-php-optimisation-tips-revisited