---
title: "Özellik Bayrakları (Feature Flag) ile Yayını Dağıtımdan Ayırmak"
url: "https://cilginyazilim.com/blog/ozellik-bayraklari-feature-flag"
description: "Özellik bayrağı nedir, riski nasıl azaltır? Kademeli açılım, hedef kitle seçimi, bayrak borcu ve çalışan bir PHP uygulamasıyla pratik anlatım."
published: "2026-09-19T10:00:00+03:00"
modified: "2026-09-19T10:00:02+03:00"
author: "superadmin"
category: "Yazılım Geliştirme"
tags: ["php", "ci/cd", "yazılım projeleri", "teknik borç", "risk yönetimi", "dağıtım", "geri alma", "özellik bayrağı", "kademeli yayın", "a/b testi", "feature flag", "trunk based", "ürün yönetimi"]
site: "CılgınYazılım"
language: "tr"
---

# Özellik Bayrakları (Feature Flag) ile Yayını Dağıtımdan Ayırmak

Kodu dağıtmak ile özelliği açmak aynı an olmak zorunda değil. Bu ayrım, riskin büyük kısmını ortadan kaldırır.

Bir **özellik bayrağı**, kodun içindeki bir anahtardır: özellik dağıtılmıştır ama açık olup olmadığına çalışma zamanında karar verilir. Bu ayrım kulağa küçük gelir, ancak yazılım tesliminin en riskli anını — "her şey aynı anda canlıya çıkıyor" anını — ortadan kaldırır.

![Özellik bayraklarının kullanım türleri](https://cilginyazilim.com/uploads/blog/2026/08/ozellik-bayraklari-feature-flag-ozet.png)
*Bayrağı eklemek kolaydır; asıl disiplin onu zamanında kaldırmaktır.*

## Dağıtım ve yayın aynı şey değildir

Klasik akışta kodu dağıtmak ile özelliği kullanıcılara açmak tek bir olaydır. Sorun çıkarsa tek çare geri almaktır ve bu, o dağıtımdaki *diğer* düzeltmeleri de geri alır. Bayrak kullandığınızda özelliği kapatmak yeterlidir; kalan değişiklikler yerinde durur. Geri alma stratejisini [geri alma planı](https://cilginyazilim.com/blog/geri-alma-plani-olmayan-dagitim-dagitim-degildir) yazımızda ele almıştık — bayraklar bu planın en ucuz biçimidir.

## Basit ama yeterli bir uygulama

```php
final class Bayraklar
{
    /** @var array<string, array> */
    private array $tanimlar;

    public function __construct(private ?int $kullaniciId = null)
    {
        // Kaynak: veritabanı veya yapılandırma. Önbelleğe alınmalı.
        $this->tanimlar = cache()->remember('bayraklar', 60, static fn() =>
            array_column(db_connect()->table('ozellik_bayraklari')->get()->getResultArray(), null, 'anahtar')
        );
    }

    public function acik(string $anahtar): bool
    {
        $b = $this->tanimlar[$anahtar] ?? null;

        // Tanımsız bayrak KAPALI sayılır: yazım hatası özelliği kazara açmasın
        if ($b === null || (int) $b['aktif'] !== 1) {
            return false;
        }

        // Belirli kullanıcılar (iç ekip, pilot müşteri)
        $liste = array_filter(array_map('intval', explode(',', (string) $b['kullanicilar'])));
        if ($this->kullaniciId && in_array($this->kullaniciId, $liste, true)) {
            return true;
        }

        $oran = (int) $b['yuzde'];
        if ($oran >= 100) { return true; }
        if ($oran <= 0)   { return false; }

        // Kullanıcı yoksa oranı uygulama: anonim ziyaretçide kararlılık sağlanamaz
        if (! $this->kullaniciId) {
            return false;
        }

        // KARARLI dağıtım: aynı kullanıcı her istekte aynı sonucu alır
        return (crc32($anahtar . ':' . $this->kullaniciId) % 100) < $oran;
    }
}
```

> Oran hesabında `rand()` kullanmayın. Rastgele karar, aynı kullanıcının bir istekte yeni arayüzü, sonraki istekte eskisini görmesine yol açar — bu, hata olarak bildirilmesi neredeyse imkânsız bir kullanıcı deneyimi üretir.

## Kullanımı okunur tutmak

```php
$bayraklar = new Bayraklar(session()->get('user_id'));

if ($bayraklar->acik('yeni_siparis_akisi')) {
    return $this->yeniSiparisAkisi();
}

return $this->eskiSiparisAkisi();
```

Bayrak kontrolünü dağıtmayın. Aynı bayrağı on farklı yerde sorgulamak, temizlik zamanı geldiğinde hepsini bulmayı zorlaştırır. Mümkünse kontrolü giriş noktasında yapıp aşağıya karar sonucunu geçirin.

Bayrak durumlarının kim tarafından ne zaman değiştirildiğini görmek isterseniz bu değişiklikleri [olay günlüğüne](https://cilginyazilim.com/blog/olay-gunlugu-event-log-tasarimi) yazmak en sade çözümdür.

## Bayrak borcu: en gerçek maliyet

Bayrakların bilinen ve kaçınılmaz sorunu birikmeleridir. Her bayrak kodda bir dallanma, testte iki senaryo demektir. On bayrak teorik olarak 1024 kombinasyon üretir; pratikte kimse bunu test etmez ve beklenmedik etkileşimler ortaya çıkar.

Disiplin basittir: **yayın bayrakları geçicidir.** Bayrağı eklerken kaldırma tarihini de tanımlayın ve bu tarihi görünür kılın.

```sql
-- Süresi geçmiş bayrakları raporlayan sorgu (haftalık çalıştırın)
SELECT anahtar, aciklama, yuzde, kaldirma_tarihi,
       DATEDIFF(CURDATE(), kaldirma_tarihi) AS gun_gecikme
FROM ozellik_bayraklari
WHERE tur = 'yayin'
  AND kaldirma_tarihi < CURDATE()
ORDER BY gun_gecikme DESC;
```

Bu sorgunun çıktısını sprint planlamaya girdi yapmak, bayrak borcunu [teknik borcun](https://cilginyazilim.com/blog/teknik-borc-ne-zaman-odenir-ne-zaman-tasinir) görünür bir kalemi hâline getirir. Kapsamın sessizce büyümesini önlemek içinse [kapsam kayması yönetimi](https://cilginyazilim.com/blog/kapsam-kaymasi-scope-creep-yonetimi) yazımızdaki çerçeve tamamlayıcıdır.

Bayrakla yayına alınan işin süresi ve maliyeti sorulduğunda [maliyet ve süre SSS](https://cilginyazilim.com/blog/yazilim-maliyeti-ve-suresi-sik-sorulan-sorular) sayfamız ortak bir dil kurmayı kolaylaştırır.

## Bayrak türlerini karıştırmayın

Yayın bayrağı haftalar yaşar ve silinir. Deney bayrağı testin süresi kadar yaşar; sonucu [erken durdurma tuzağına düşmeden](https://cilginyazilim.com/blog/ab-testini-yanlis-okumak-erken-durdurma) okunmalıdır. İşletme bayrağı (müşteri paketine göre özellik açma) ise kalıcıdır ve aslında bir yetkilendirme kuralıdır — onu bayrak sistemine değil, izin modeline koymak daha doğrudur. Bu ayrımın yapılmaması, "temizlenemeyen bayrak" yığınının en yaygın sebebidir.

Trunk-based geliştirme ile bayraklar birbirini tamamlar: uzun ömürlü dal açmadan, yarım özelliği kapalı bayrak arkasında ana dala birleştirebilirsiniz. Bu ilişki için [dallanma stratejisi](https://cilginyazilim.com/blog/dallanma-stratejisi-trunk-based-mi-git-flow-mu) yazımıza ve [Martin Fowler'ın feature toggle makalesine](https://martinfowler.com/articles/feature-toggles.html) bakabilirsiniz.

## Sonuç

Özellik bayrakları, yazılım tesliminde riski zamana yayan en basit araçtır: kodu dağıtırsınız, özelliği hazır olduğunuzda açarsınız, sorun çıkarsa saniyeler içinde kapatırsınız. Kurarken üç kurala uyun — tanımsız bayrak kapalı sayılsın, oran dağıtımı kullanıcı bazında kararlı olsun, her yayın bayrağının bir kaldırma tarihi bulunsun. Bayrak eklemek bir günlük iştir; onu zamanında kaldırmak ise sistemin uzun vadeli sağlığını belirler. Bir sonraki riskli özelliğinizi bayrak arkasında dağıtmayı deneyin, ilk kapatma anında getirisini göreceksiniz.

## Sıkça Sorulan Sorular

### Kaç bayrak fazla sayılır?

Mutlak bir sayı yok, ama aynı anda açık on yayın bayrağı çoğu ekip için yönetilemez hâle gelir. Daha iyi ölçüt yaştır: üç aydan eski bir yayın bayrağı varsa, süreç değil disiplin sorunu vardır.

### Bayrakların test edilmesi gerekir mi?

Kritik bayrakların iki durumu da test edilmelidir; ancak tüm kombinasyonları test etmek pratik değildir. Yaygın yaklaşım, üretimde açık olan yapılandırmayı ve bayrağın kapalı hâlini test etmek, gerisini kabul edilebilir risk saymaktır.

### Bayrak durumunu nerede saklamalıyım?

Veritabanı ya da yapılandırma servisi uygundur; önemli olan değişikliğin yeni dağıtım gerektirmemesidir. Bayrağı .env dosyasında tutmak, "anında kapatabilme" faydasını ortadan kaldırır çünkü değişiklik için dağıtım gerekir.

### Bayrak kontrolü performansı etkiler mi?

Her istekte veritabanına gitmek etkiler; bu yüzden bayrak tanımları kısa süreli önbellekte tutulmalıdır. Bir dakikalık önbellek, hem yükü kaldırır hem de acil kapatmanın makul sürede yayılmasını sağlar.

---

Kaynak: [Özellik Bayrakları (Feature Flag) ile Yayını Dağıtımdan Ayırmak](https://cilginyazilim.com/blog/ozellik-bayraklari-feature-flag)
