Uzmanlık
PHP geliştiricisi — 2008'den beri
2008'den beri PHP'nin her türlüsünü yazıyorum; Laravel, Symfony, CodeIgniter fark etmiyor. Uzun yılların verdiği deneyimle en rahat olduğum ekosistem burası.
- Başlangıç
- 2008 Başlangıç
- yıl
- 18 yıl
- yazı
- 90 yazı
- proje
- 9 proje
PHP ekosisteminde ben
PHP geliştiricisi olarak işimin merkezinde tek bir soru duruyor: iş kuralı nerede yaşayacak? Framework seçimi, dizin düzeni ve test yüzeyi bu sorunun cevabından sonra geliyor. Ters sırayla kurulan projelerde kural uygulamanın her yerine dağılıyor ve bakım maliyeti tam orada başlıyor.
Aşağıdakiler uygulama seviyesinde ne yaptığım ve kararları neye göre verdiğim. Mikroservis sınırları, event-driven tasarımın kendisi ve veritabanı iç mekaniği gibi konuları maliyetleriyle birlikte sade.dev tarafında yazıyorum.
PHP tarafında ne geliştiriyorum
Ortak noktaları tanıtım sitesi olmamaları; PHP'yi iş kuralının yaşadığı yerde kullanıyorum.
-
Fatura ve ödeme akışları
Para akışına dokunan, iş kuralını uygulamanın içinde taşıyan sistemler.
-
Asenkron arka plan işleri
Kuyruk, consumer ve idempotent tüketim; senkron beklemeyi kullanıcının önünden alan yapılar.
-
Framework'lü kurulumlar
Laravel, Symfony ve CodeIgniter; sıfırdan kurduğum işlerde de devraldığım kod tabanlarında da. Üçü de aynı dilin üstünde duruyor; uygulama seviyesinde asıl işi yapan şey framework değil, iş kuralını nereye koyduğunuz.
-
Framework'süz kütüphaneler
Tek başına çalışabilen, MIT lisanslı paketler; router'dan PSR-11 container'a kadar. Bir kütüphaneyi başkasının projesine soktuğunuzda geri alınamayan tek şey imzadır.
Framework kararını nasıl veriyorum
Yeni bir işe girerken önce framework seçmiyorum; sırayı belirleyen şey de benim tercihim değil.
- 01 Senkron mu, asenkron mu
- Bu karar kuyruğu, hata sözleşmesini ve aynı istek iki kez geldiğinde ne olacağını birlikte belirliyor; sonradan değiştirmesi en pahalı karar bu ve framework'ten önce geliyor.
- 02 Ekipteki geliştiricilerin bildiği araç
- Ekipte Symfony bilen yoksa o ürünü Symfony ile yazmak, kazandırdığından fazlasını götürür.
- 03 MVP'ye verilen süre ve ürünün kendi ihtiyacı
- Teslim tarihi ve ürünün kendine özgü ihtiyacı, bir framework'ün hazır getirdiklerinin ne kadarını gerçekten kullanacağımı belirliyor.
- 04 Performans, en sonda
- Bu kararın en zayıf gerekçesi. Ölçtüğümde framework'ler arasındaki fark, istek gerçek iş yapmaya başlar başlamaz kapanıyor.
Devraldığım bir kod tabanında sıra
İşlerin bir kısmı sıfırdan kurulmuyor, devralınıyor; devralınan kodda ilk iş yeniden yazmak değil.
- 01 Önce davranışı anlamak
- Hangi kural nerede duruyor, hangi yan etki hangi isteğe bağlı, testin koruduğu yüzey nereye kadar uzanıyor. Bunlar netleşmeden yapılan iyileştirme, çalışan bir sistemi görünmez biçimde bozma riskidir.
- 02 Sonra test yüzeyini genişletmek
- Değişikliğe dokunmadan önce koruma kurmak; sonrasında yapılan her düzeltmenin bedeli düşüyor.
- 03 En son sürüm ve bağımlılık temizliği
- İşin sıradan parçası ama aynı ölçüye bağlı: değişikliğin bedeli, getirdiği rahatlıktan küçük olmalı.
Testi hangi üç yüzeyde kuruyorum
Test benim için kalite rozeti değil, değişikliğin maliyetini düşüren araç; o yüzden baştan bir yüzey olarak kuruluyor.
-
İş kuralının doğrudan sınandığı yer
Kuralın kendisi, dış dünyaya hiç çıkmadan sınanıyor. Testi olmayan bir kural, ilk yoğun günde sessizce değişebilecek bir kuraldır.
-
Dış sınırın taklit edildiği yer
Ödeme sağlayıcısı, kuyruk, üçüncü taraf servis; sınırın karşı tarafı taklit ediliyor ki test kendi başına koşabilsin.
-
Akışın uçtan uca yürütüldüğü yer
İsteğin girip sonucun çıktığı yol. Parçalar tek tek doğruyken birleşimin yanlış olduğu durumu yalnız burası görüyor.
Mimariyi burada anlatmıyorum
Mikroservis sınırları, event-driven tasarımın kendisi, veritabanı iç mekaniği ve cache stratejisi gibi konuları bu sayfada kendi başlarına ele almıyorum; onları yazdığım yer sade.dev.
Bu alandaki son yazılar
18.750 istek/sn: kesin, tekrarlanmış ve üç kat yanlış
Aynı koşunun iki fazı aynı servisi üç kat farklı ölçtü. Yanlış olanı yakalayan şey daha iyi bir istatistik değil, aynı şeyi ölçen ikinci bir yöntemdi.
Prod erişimi tek kişideydi, o kişi izne çıktı
Üretim veritabanına erişimi olan tek kişi tatile gidince geliştirme durdu. İhtiyaç dört cümleye indi; her biri bir tasarım kararına dönüştü.
Sıfırdan hızlı, mevcut sistemde yavaş: agent çağında brownfield'in gerçek maliyeti
Agent'la günlerde biten iş, yıllardır çalışan bir sistemde bir hafta sürüyor. Çünkü orada asıl maliyet kod üretmek değil; kuralı bulmak ve doğrulamak.
Bu alandaki ölçümler
Bir PHP framework'ünü kurmanın sabit maliyeti: disk boyutu hiçbir şey söylemiyor
Yedi PHP framework'ü kurulduğunda diskte kaç megabayt, istek başına kaç dosya ve ilk istekte kaç milisaniye tutuyor — ve bu sayılardan hangisi gerçekten yük altındaki hızı öngörüyor?
Bulgu
Disk boyutu hiçbir şey öngörmüyor: Yii2 en büyük vendor'a sahip (34,1 MB) ama istek başına yalnız 62 dosya yüklüyor — sahanın en azlarından. İstek başına dosya sayısı da öngörmüyor: CodeIgniter 96 dosya yükleyip 6.431 istek/sn veriyor, Symfony 224 dosya yükleyip 13.067 veriyor. Gerçekten ayrışan tek şey opcache soğukken ödenen ilk istek: Phalcon 2,2 ms, Laravel 72,2 ms — otuz üç kat. Bu, her deploy'dan sonra ilk ziyaretçinin ödediği derleme faturasıdır ve framework başına birkaç kilobayt değil, onlarca milisaniye tutuyor.
45 gün önce ölçüldü
opcache preload deploy faturasını on dört kata kadar siliyor — ama yedi framework'ün beşi onu size vermiyor
`opcache.preload` açıkken yedi PHP framework'ünün deploy sonrası ilk isteği ne kadar sürüyor, bu kazanç neye mal oluyor, ve kimler ona erişebiliyor?
Bulgu
Preload, soğuk ilk isteği 3,5 ile 14,2 kat arasında kısaltıyor (sınıfları PHP kaynağı olan altı adayda): Symfony 35,58 ms'den 2,50 ms'ye, yani Phalcon'un çıplak seviyesine iniyor. Ama yedi adayın yalnız ikisi (Symfony, CodeIgniter) resmî bir preload dosyası yayınlıyor; kalan beşinde kazanç masada duruyor ve kullanıcının kendi yazmasını bekliyor. Yazmak da göründüğü kadar kolay değil: classmap'ten körlemesine üretilen preload Symfony'yi hiç ayağa kaldırmıyor, CodeIgniter'da ise elle seçilmiş resmî dosyadan (3,13 ms) daha kötü sonuç veriyor (5,29 ms). Ve bedel kaybolmuyor: Laravel'in classmap preload'ı ziyaretçiden aldığı 62 ms'yi php-fpm'in ayağa kalkışına 2.340 ms olarak yazıyor.
43 gün önce ölçüldü
Yedi PHP framework'ü aynı yükte ölçtüm: fark, istek gerçek iş yaptıkça küçülüyor
Aynı donanımda, aynı PHP sürümünde ve aynı yedi rotayla, Laravel, Symfony, CodeIgniter, Yii2, Phalcon, Laminas ve Slim saniyede kaç isteği ne gecikmeyle karşılıyor?
Bulgu
Boş bir rotada en hızlı ile en yavaş arasında 4,4 kat var (Slim 25.975, Laravel 5.966 istek/sn). Ama istek gerçek iş yapmaya başlayınca fark kapanıyor: veritabanından tek satır çeken bir istekte 3,7 kata, yirmi satır çekende 3,5 kata iniyor. Phalcon boş rotada üçüncüyken veritabanı isteğinde beşinciye düşüyor — C eklentisi olmak, sorgu beklerken bir işe yaramıyor. Asıl pahalı olan şey framework seçimi değil: Laravel'in kendi varsayılan web middleware grubu, aynı yanıtı 5.858'den 2.176 istek/sn'ye düşürüyor — yani tek bir varsayılan, framework'ler arasındaki farkın çoğundan daha pahalı.
45 gün önce ölçüldü
Bu alanda geliştirdiklerim
Herkese açık, ücretsiz okunan, metin merkezli öğrenme platformu; ders kitabı teorisiyle sektörde karşılaşılan problemleri tek ders akışında tutuyor.
Şu an ne yapıyor
Dersleri kayıt olmadan ücretsiz okunan bir öğrenme platformu olarak yayında: müfredat-kurs-konu-ders hiyerarşisi, tam metin arama ve ilerleme takibi çalışıyor; kurs sonu sınavı, doğrulanabilir sertifika ve çalışma asistanı Pro katmanda. Bilgisayar bilimleri müfredatını okumak isteyen herkes bugün kullanabilir.
Kur'an okumak, anlamak ve öğrenmek isteyenler için açık ve ücretsiz bir kaynak; Kur'an ve hadis merkezli araştırmayı tek çatı altında topluyor.
Şu an ne yapıyor
Kur'an ve hadis metinlerini birlikte okumaya ve aramaya açık, ücretsiz bir kaynak olarak yayında; harf düzeyinde parmak izi eşlemesi hadis koleksiyonlarında %91–99 kapsam veriyor. Kaynağa doğrudan bakmak isteyen okuyucu ve araştırmacı bugün kullanabilir.
Çok hesaplı gelir-gider takibini tek modelde toplayan finans çekirdeği; web + iOS + Android'de çalışan Parantaj'a dönüştü.
Şu an ne yapıyor
Tek hesap/işlem modeli çoklu hesap yönetimini, bütçeyi, hedefleri ve raporlamayı aynı çekirdekte taşıyor; web, iOS ve Android istemcileri yayında. Kişisel ve kurumsal finansını tek yerden takip etmek isteyen kullanabilir.
Bu alanda üretime çıkan işler
academia.sh
Devam ediyorFounder & Author
Seviye: Aktif Geliştirmeacademia.sh, bir dersin teorisini sahadan gelen gerçek bir problemden ayırmayan, dersleri kayıt olmadan ücretsiz okunan bir öğrenme platformudur. Müfredat-kurs-konu-ders hiyerarşisiyle sunulur, ilerleme ve quiz teoriyle problemi ayırmadan ders bazında ölçülür, tam metin arama Postgres üzerinde çalışır; kurs sonu sınavı, sertifika ve çalışma asistanı Pro katmanda. İçerik ayrı bir GitHub reposunda tutulur; ilk alan bilgisayar bilimleri, model baştan çok disiplinli tasarlandı.
Qurandia
Devam ediyorFounder & Developer
Seviye: Aktif GeliştirmeQurandia, birbirini tanımayan hadis veri setlerini numaraya değil metnin harf düzeyinde parmak izine güvenerek eşleştiren; Kur'an ve hadis merkezli, açık ve ücretsiz bir okuma ve araştırma kaynağıdır. Meal, kelime-kelime çözümleme, tefsir, sebeb-i nüzul, hadis külliyatı ve arama tek çatı altında; doğrudan numara eşleştirmesi %0-14 tutarlıyken, metin parmak izi eşleşmeyi %91-99'a çıkarıyor. Türkçe hadis çevirisi kapsamı bugün %83.
QueryProxy
Devam ediyorFounder & Developer
Seviye: Ana OdakQueryProxy, geliştiricilerin üretim veritabanına kimlik bilgisi almadan erişebilmesi için geliştirdiğim self-hosted bir sorgu onay portalıdır. Yazılan SQL çözümlenerek denetlenir, bir DBA onayından geçtikten sonra kuyrukta çalışır, sonuçlar diske yazılırken maskelenir ve her adım değiştirilemez bir denetim kaydına düşer.
Bu alanda sorulanlar
Bu eksende 16 soru yanıtlandı.
Integer cent olarak sakladığım para alanları için custom cast mı yoksa accessor/mutator mı kullanmalıyım?
DB'de integer cent, modelde immutable `Money`: eşlemeyi tek bir `CastsAttributes` sınıfına toplayın, currency'yi aynı cast'ta ikinci kolon yapın.
Birçok modele bağlanan yorumlar için polymorphic ilişki mi yoksa ayrı tablolar mı; index ve foreign key açısından hangisi daha sağlıklı?
3 stabil tip ve gerçek foreign key gerekiyorsa tek tabloda exclusive arc kurun; tip sayısı açık uçluysa saf morph'ta `enforceMorphMap` şarttır.
Eşzamanlı HTTP çağrıları için ham Fiber mı, ReactPHP/AMPHP mı, yoksa Swoole mu seçmeliyim?
FPM'de kalıp Guzzle Pool ile başlayın, concurrency'yi 20-50'de sabitleyin; kod tabanı gerçekten async'e evrilirse AMPHP v3, yeniden mimaride Swoole.
Birlikte kullandığım teknolojiler
-
Laravel
İş kuralı ve para akışı taşıyan işlerde ilk uzandığım framework.
-
Symfony
Bileşen bileşen kurulan, sınırı net projelerde tercih ettiğim framework.
-
CodeIgniter
Hem sıfırdan başladığım hem devraldığım kod tabanlarında karşıma çıkan hafif framework.
-
Composer
Bağımlılık yönetimi; 2014'te kütüphane zip'i indirmeyi bıraktığım yer.
-
PHPUnit
Test tarafının tabanı; eski kod tabanlarında hâlâ karşılaştığım araç.
-
Pest
Yeni projelerde test yüzeyi olarak tercih ettiğim katman.
-
Redis
Önbellek, oturum ve kuyruk deposu.
-
MySQL
Birincil ilişkisel depo.
-
RabbitMQ
Faturalandırmayı senkron akıştan çıkardığım yer.
Sık sorulanlar
7 soru
-
PHP ile kaç yıldır çalışıyorsun?
2008'den bu yana, 18 yıldır. Bu sürenin 90 yazılık kısmı bu sitede kayıtlı.
-
Hangi PHP framework'lerini kullanıyorsun?
Derinliğim Laravel'de: ilk projeme Laravel 4 ile başladım, blog arşivinde 5'ten 12'ye kadar ayrı geçiş notları var. Ama tek framework'üm Laravel değil — Symfony ve CodeIgniter'ı hem sıfırdan kurduğum işlerde hem devraldığım kod tabanlarında kullandım.
-
Framework kullanmadan PHP yazıyor musun?
Evet. Tek başına çalışabilen paketleri, router'dan PSR-11 container'a kadar, framework'e yaslanmadan yazdım; hepsi MIT lisansıyla Packagist'te. Framework'e yaslanmadan PHP yazmak, framework'ün sizin yerinize ne yaptığını öğrenmenin de en kısa yolu.
-
Bir proje için PHP framework'ünü neye göre seçiyorsun?
Üç parametre belirliyor: MVP'ye verilen süre, ekipteki geliştiricilerin bildiği araç ve ürünün kendine özgü ihtiyacı. Performans genelde bu kararın en zayıf gerekçesi — ölçtüğümde framework'ler arasındaki fark, istek gerçek iş yapmaya başlar başlamaz kapanıyor.
-
Yeni bir PHP projesine nasıl başlıyorsun?
Framework seçerek değil. Önce işin senkron mu asenkron mu yürüyeceğine karar veriyorum. Bu karar kuyruğu, hata sözleşmesini ve idempotency ihtiyacını birlikte belirlediği için sonradan değiştirmesi en pahalı karar o.
-
Mimari tasarım da yapıyor musun?
Evet, ama o tarafı burada anlatmıyorum. Bu sayfa uygulama seviyesinde ne yaptığımı gösterir; mimari kararların kendisini maliyetleriyle birlikte sade.dev'de yazıyorum.
-
Kaç projede PHP kullandın?
Bu sitede kayıtlı projelerin 9 tanesi PHP tarafına dokunuyor; freelance dönemde teslim ettiğim işlerin çoğu portfolyoda değil.
Birlikte çalışalım
Bu ekosistemde bir işiniz varsa, ne yaptığınızı anlatın; nasıl kurulacağını konuşalım.