PHP code example of berkan / server

1. Go to this page and download the library: Download berkan/server library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

berkan / server example snippets




use Berkan\Drivers\BerkanDriver;

class MyCustomBerkanDriver extends BerkanDriver
{
    /**
     * Determine if the driver serves the request.
     * Return true if this driver should handle sites at $sitePath.
     */
    public function serves(string $sitePath, string $siteName, string $uri): bool
    {
        return file_exists($sitePath . '/my-app-config.php');
    }

    /**
     * Determine if the incoming request is for a static file.
     * Return the full file path, or false if not a static file.
     */
    /**
     * @return string|false
     */
    public function isStaticFile(string $sitePath, string $siteName, string $uri)
    {
        $staticPath = $sitePath . '/public' . $uri;

        if (file_exists($staticPath) && !is_dir($staticPath)) {
            return $staticPath;
        }

        return false;
    }

    /**
     * Get the fully resolved path to the application's front controller.
     */
    public function frontControllerPath(string $sitePath, string $siteName, string $uri): string
    {
        $_SERVER['SCRIPT_FILENAME'] = $sitePath . '/public/index.php';
        $_SERVER['SCRIPT_NAME'] = '/index.php';
        $_SERVER['DOCUMENT_ROOT'] = $sitePath . '/public';

        return $sitePath . '/public/index.php';
    }
}



use Berkan\Drivers\BerkanDriver;

class BenimOzelBerkanDriver extends BerkanDriver
{
    /**
     * Driver'ın isteği sunup sunmayacağını belirler.
     * Bu driver $sitePath'teki siteleri yönetmeli mi?
     */
    public function serves(string $sitePath, string $siteName, string $uri): bool
    {
        return file_exists($sitePath . '/benim-config.php');
    }

    /**
     * Gelen isteğin statik bir dosya için olup olmadığını belirler.
     * Tam dosya yolunu veya statik değilse false döndürün.
     */
    /**
     * @return string|false
     */
    public function isStaticFile(string $sitePath, string $siteName, string $uri)
    {
        $staticPath = $sitePath . '/public' . $uri;

        if (file_exists($staticPath) && !is_dir($staticPath)) {
            return $staticPath;
        }

        return false;
    }

    /**
     * Uygulamanın ön denetleyicisine (front controller) tam çözümlenmiş yolu alır.
     */
    public function frontControllerPath(string $sitePath, string $siteName, string $uri): string
    {
        $_SERVER['SCRIPT_FILENAME'] = $sitePath . '/public/index.php';
        $_SERVER['SCRIPT_NAME'] = '/index.php';
        $_SERVER['DOCUMENT_ROOT'] = $sitePath . '/public';

        return $sitePath . '/public/index.php';
    }
}
bash
brew install php composer

Found 3 projects in [/Users/you/Sites]:

  blog [WordPress] — PHP version?
    [0] Default (global PHP)
    [1] 8.4
    [2] 7.4
  > 2

  myapp [Laravel] — PHP version?
    [0] Default (global PHP)
    [1] 8.4
  > 0

  legacy-api [PHP (Composer)] — PHP version?
    [0] Default (global PHP)
    [1] 8.4
    [2] 7.4
  > 2

Found 3 projects in [/Users/you/Sites]:

  blog [WordPress] — PHP version?
  > 7.4

  myapp [Laravel] — PHP version?
  > Default (global PHP)

  api [Symfony] — PHP version?
  > 8.3
bash
# Install a modern PHP version
sudo berkan php:install 8.2

# Install a legacy PHP version (shivammathur/php tap is added automatically)
sudo berkan php:install 7.4
sudo berkan php:install 5.6

# Remove a PHP version (cannot remove the active version)
sudo berkan php:remove 8.1

# List all installed PHP versions
berkan php:list

# Output:
# +-------------+---------+--------+
# | PHP Version | Status  | Active |
# +-------------+---------+--------+
# | [email protected]     | Running | Yes    |
# | [email protected]     | Stopped |        |
# | [email protected]     | Running |        |
# | [email protected]     | Running |        |
# +-------------+---------+--------+
bash
# Run PHP with Berkan's version
berkan php -v
berkan php artisan migrate
berkan php script.php

# Run Composer with Berkan's PHP
berkan composer install
berkan composer 
json
{
    "tld": "test",
    "loopback": "127.0.0.1",
    "http_port": "80",
    "https_port": "443",
    "paths": [
        "/Users/you/Sites",
        "/Users/you/Projects"
    ],
    "web_server": "apache",
    "php_versions": ["8.4", "8.3", "7.4"],
    "databases": ["mysql", "redis"],
    "isolated_versions": {
        "legacy-app": "[email protected]",
        "old-wordpress": "[email protected]"
    },
    "hide_errors": false,
    "short_open_tag": false
}
bash
# Enable short open tag (<? syntax)
berkan shorttag on

# Disable short open tag (only  works)
berkan shorttag off

# Check current status
berkan shorttag

Berkan Diagnostics
==================================================
+-------------------------+-----------------------------------+
| Check                   | Result                            |
+-------------------------+-----------------------------------+
| Berkan Version          | 1.0.0                             |
| PHP Version             | 8.4.18                            |
| PHP Binary              | /opt/homebrew/opt/[email protected]/bin/php |
| Operating System        | Darwin 24.6.0                     |
| Homebrew Prefix         | /opt/homebrew                     |
| TLD                     | test                              |
| Loopback                | 127.0.0.1                         |
| Web Server              | apache                            |
| Apache (httpd) Status   | Running                           |
| PHP-FPM Status          | Running                           |
| DnsMasq Status          | Running                           |
| Apache (httpd) Config   | Found                             |
| PHP-FPM Socket          | Found                             |
| DNS Resolver            | Found                             |
| Installed PHP           | [email protected], [email protected]                  |
| Linked PHP              | [email protected]                           |
| Apache (httpd) Config T.| Syntax OK                         |
| Parked Paths            | /Users/you/Sites                  |
| DNS Test                | 127.0.0.1                         |
| Installed Databases     | mysql, redis                      |
+-------------------------+-----------------------------------+
bash
# Check if default socket exists
ls -la ~/.config/berkan/berkan.sock

# Check isolated sockets (e.g., PHP 7.4)
ls -la ~/.config/berkan/berkan-7.4.sock

# Restart PHP-FPM
sudo brew services restart php

# Restart a specific isolated PHP-FPM
sudo brew services restart [email protected]

# Check PHP-FPM log
berkan log php-fpm
bash
brew install php composer

Found 3 projects in [/Users/siz/Sites]:

  blog [WordPress] — PHP version?
    [0] Default (global PHP)
    [1] 8.4
    [2] 7.4
  > 2

  myapp [Laravel] — PHP version?
    [0] Default (global PHP)
    [1] 8.4
  > 0

  eski-api [PHP (Composer)] — PHP version?
    [0] Default (global PHP)
    [1] 8.4
    [2] 7.4
  > 2
bash
# 1. Homebrew, PHP ve Composer kurun (zaten kuruluysa atlayın)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install php composer

# 2. Berkan'ı kurun
composer global s
berkan park

# 5. Bir Laravel projesi oluşturun
composer create-project laravel/laravel myapp

# 6. Tarayıcıda ziyaret edin
# http://myapp.test

# 7. HTTPS ile güvenli hale getirin
sudo berkan secure myapp

# 8. HTTPS ile ziyaret edin
# https://myapp.test

# 9. Eski bir proje için eski PHP versiyonu kurun
sudo berkan php:install 7.4

# 10. Eski siteyi PHP 7.4'e izole edin
cd ~/Sites/eski-uygulama
berkan isolate 7.4

Found 3 projects in [/Users/siz/Sites]:

  blog [WordPress] — PHP version?
  > 7.4

  myapp [Laravel] — PHP version?
  > Default (global PHP)

  api [Symfony] — PHP version?
  > 8.3
bash
# Modern PHP versiyonu kur
sudo berkan php:install 8.2

# Eski PHP versiyonu kur (shivammathur/php tap'ı otomatik eklenir)
sudo berkan php:install 7.4
sudo berkan php:install 5.6

# PHP versiyonu kaldır (aktif versiyon kaldırılamaz)
sudo berkan php:remove 8.1

# Kurulu PHP versiyonlarını listele
berkan php:list

# Çıktı:
# +-------------+---------+--------+
# | PHP Version | Status  | Active |
# +-------------+---------+--------+
# | [email protected]     | Running | Yes    |
# | [email protected]     | Stopped |        |
# | [email protected]     | Running |        |
# | [email protected]     | Running |        |
# +-------------+---------+--------+
bash
cd ~/Sites/eski-uygulama
berkan isolate 7.4
# berkan-7.4.sock ve izole PHP-FPM havuzu oluşturulur

cd ~/Sites/modern-uygulama
berkan isolate 8.4
# berkan-8.4.sock ve izole PHP-FPM havuzu oluşturulur

# İzole edilmiş siteleri listele
berkan isolated
# +------------------+-------------+
# | Site             | PHP Version |
# +------------------+-------------+
# | eski-uygulama    | [email protected]     |
# | modern-uygulama  | [email protected]     |
# +------------------+-------------+

# İzolasyonu kaldır
cd ~/Sites/eski-uygulama
berkan unisolate
bash
# Berkan'ın versiyonuyla PHP çalıştır
berkan php -v
berkan php artisan migrate
berkan php script.php

# Berkan'ın PHP'siyle Composer çalıştır
berkan composer install
berkan composer 
`):



Since `short_open_tag` is a `PHP_INI_PERDIR` directive, it cannot be changed at runtime with `ini_set()`. Berkan handles this by writing a dedicated `.ini` file (`berkan-short-open-tag.ini`) to each installed PHP version's `conf.d` directory and restarting PHP-FPM.

The setting is applied to **all installed PHP versions** simultaneously.

## Logs & Diagnostics

### Viewing Logs



### Running Diagnostics



This displays a comprehensive diagnostic report:



## Architecture

### Technology Stack



### Project Structure



## Troubleshooting

### Web server won't start

**Apache:**


**Nginx:**


### Port conflicts

If ports 80/443 are occupied by another service, you have two options:

1. **Use custom ports** - Run `berkan install` again and select alternative ports (e.g., 8080/8443). The ports are stored in `config.json` and all server configurations are updated automatically.

2. **Free the default ports** - Stop the conflicting service:
   

When using custom ports, access your sites with the port number: `http://myapp.test:8080` or `https://myapp.test:8443`.

### Sites not resolving



### PHP-FPM socket not found



### HTTPS certificate not trusted



### Database won't start



### Complete reset



## Uninstalling

### Soft uninstall (keeps configuration)



### Full uninstall (removes everything)



This removes:
- Web server configuration changes (Apache or Nginx)
- PHP-FPM berkan pool
- DnsMasq TLD configuration
- DNS resolver file
- Sudoers entry
- Loopback configuration
- Stops all installed databases
- All files in `~/.config/berkan/` (with `--force`)
- The `/usr/local/bin/berkan` symlink

---

# Türkçe

## Berkan Nedir?

**Berkan**, macOS üzerinde hem **Apache (httpd)** hem de **Nginx** web sunucusunu destekleyen hafif bir PHP geliştirme ortamıdır. Kurulum sırasında tercih ettiğiniz web sunucusunu seçin, istediğiniz zaman aralarında geçiş yapın, PHP versiyonlarını ve veritabanlarını tek bir CLI'dan yönetin.

Berkan, Mac'inizi her açıldığında arka planda seçtiğiniz web sunucusu, PHP-FPM ve DnsMasq'i çalıştıracak şekilde yapılandırır. Ardından DnsMasq kullanarak `.test` TLD'sindeki tüm istekleri yerel makinenizdeki sitelere yönlendirir.

Yani yaklaşık **7 MB RAM** kullanan, hızlı bir macOS PHP geliştirme ortamı. Berkan, Vagrant veya Docker'ın tam bir alternatifi değildir, ancak esnek ve hız odaklı bir çalışma ortamı istiyorsanız harika bir seçenektir.

## Özellikler

### Web Sunucu (Apache veya Nginx)

Berkan, kurulum sırasında **Apache** veya **Nginx** arasında seçim yapmanıza olanak tanır ve istediğiniz zaman `berkan server:switch` ile geçiş yapabilirsiniz.

**Apache (httpd):**
- Native **`.htaccess` desteği** - rewrite kuralları üretim ortamıyla birebir aynı çalışır
- **`mod_rewrite`** ile URL yönlendirme ve temiz URL'ler
- **`mod_ssl`** ile kendinden imzalı güvenilir sertifikalarla TLS/HTTPS
- **`mod_proxy` + `mod_proxy_fcgi`** ile Apache'den PHP-FPM'e Unix soket üzerinden bağlantı
- **`mod_proxy_http`** ile diğer yerel servislere ters proxy
- **`mod_headers`**, **`mod_deflate`**, **`mod_vhost_alias`**, **`mod_http2`**
- Her yeniden başlatmadan önce otomatik `apachectl configtest` doğrulaması

**Nginx:**
- Yüksek performanslı event-driven mimari
- **`fastcgi_pass`** ile Nginx'ten PHP-FPM'e Unix soket üzerinden bağlantı
- HTTP/2 destekli **SSL/TLS**
- WebSocket destekli **ters proxy**
- Kutudan çıkan **Gzip sıkıştırma**
- Her yeniden başlatmadan önce otomatik `nginx -t` doğrulaması

### Site Sunma

- **Sıfır konfigürasyon** - bir dizini park edin, her alt klasör anında `.test` sitesi olur
- **İnteraktif park** - `berkan park` projeleri tarar, framework algılar ve proje bazında PHP versiyonu seçmenizi sağlar
- Dizinleri toplu **park** edin: `~/Sites/blog` otomatik olarak `http://blog.test` olur
- Diskteki herhangi bir konumdan projeleri özel isimlerle **link**'leyin
- Driver sistemi ile **otomatik framework algılama** (25'ten fazla yerleşik driver)
- Bulunamayan siteler için özel **404 sayfası**
- Yapılandırılabilir **dizin listeleme** (aç/kapat)

### HTTPS / SSL

- **Tek komutla HTTPS**: `berkan secure myapp` güvenilir TLS sertifikası oluşturur
- **2048-bit RSA** özel anahtarlar ve **SAN (Subject Alternative Name)** desteği
- Sertifikalar macOS Sistem Anahtarlığı'nda **otomatik olarak güvenilir** yapılır
- **HTTP'den HTTPS'ye yönlendirme** otomatik yapılandırılır
- Tüm güvenli sitelerde **HTTP/2** etkin
- Güvenli siteler için varsayılan olarak **HSTS başlığı** eklenir
- Tek komutla siteyi HTTP'ye geri döndürün

### PHP Yönetimi

- **Geniş PHP versiyon desteği**: PHP 5.6, 7.0–7.4, 8.0–8.4 — `shivammathur/php` tap ile eski versiyonlar desteklenir
- Kurulu herhangi bir PHP versiyonu arasında **global PHP versiyon değiştirme**
- `berkan php:install` / `berkan php:remove` ile istediğiniz zaman **PHP versiyonu kur/kaldır**
- `berkan php:list` ile **kurulu PHP versiyonlarını listele**
- **Site bazlı PHP izolasyonu** - farklı siteler arasında farklı PHP versiyonları çalıştırabilir
- **`berkan park` ile proje bazlı PHP seçimi** - interaktif proje tarama, otomatik framework algılama ve PHP versiyon atama
- **İzole PHP-FPM havuzları** - her izole versiyon kendi soketini alır (`berkan-7.4.sock`, `berkan-8.1.sock`, vb.)
- **Park sırasında otomatik framework algılama**: Laravel, Symfony, WordPress, Drupal, Magento 2, Craft CMS, Joomla, Composer projeleri, Plain PHP
- `berkan php` - Berkan'ın yönettiği versiyonla PHP CLI çalıştırma
- `berkan composer` - doğru PHP binary'si ile Composer çalıştırma
- Unix soket (`berkan.sock`) ile otomatik **PHP-FPM havuz yapılandırması**
- Geliştirme için ayarlanmış bellek limiti, yükleme boyutu ve çalışma süresi (512 MB, zaman aşımı yok)

### Hata Görüntüleme Kontrolü

- `berkan error hide` / `berkan error show` ile **PHP hata görüntülemesini açıp kapatın**
- Güvenilir istek bazlı hata kontrolü için PHP-FPM `auto_prepend_file` kullanır
- `.htaccess` rewrite kuralları ve PHP versiyon izolasyonu olan siteler dahil tüm sitelerde tutarlı çalışır
- Ayarlar `config.json`'da saklanır ve yeniden başlatma gerekmeden anında etki eder

### Short Open Tag

- `berkan shorttag on` / `berkan shorttag off` ile **PHP `short_open_tag` ayarını açıp kapatın**
- Tüm kurulu PHP versiyonlarında `<?` kısa tag sözdizimini etkinleştirir veya devre dışı bırakır
- Her PHP versiyonunun `conf.d` dizininde özel bir `.ini` dosyası (`berkan-short-open-tag.ini`) kullanır
- Ayarlar `config.json`'da saklanır ve PHP-FPM yeniden başlatılarak uygulanır

### Veritabanı Yönetimi

- Berkan CLI'dan doğrudan **veritabanlarını kurun ve yönetin**
- Desteklenen veritabanları:
  - **MySQL** - `berkan db:install mysql`
  - **PostgreSQL** - `berkan db:install postgresql`
  - **MongoDB** - `berkan db:install mongodb`
  - **Redis** - `berkan db:install redis`
- Tek tek veya tüm veritabanlarını **başlat, durdur, yeniden başlat**
- `berkan status` ve `berkan db:list` ile **veritabanı durumunu görün**
- `berkan install` sırasında interaktif veritabanı seçimi

### DNS Çözümleme

- **DnsMasq** tüm `*.test` (veya özel TLD) alan adlarını loopback adresinize çözümler
- macOS **resolver dosyası** (`/etc/resolver/test`) ile sorunsuz sistem genelinde DNS
- **Özel TLD** desteği - `.test`'i `.dev`, `.local` veya başka herhangi bir şeye değiştirin
- **Özel loopback adresi** - varsayılan `127.0.0.1`, herhangi bir IP'ye yapılandırılabilir

### Proxy

- Herhangi bir `.test` alan adını başka bir yerel servise (Node.js, Go, Python, Docker, vb.) **ters proxy**
- Otomatik **WebSocket desteği**
- Proxy siteler isteğe bağlı olarak **HTTPS ile güvenli** hale getirilebilir

### Paylaşım

- Üç tünel aracı ile yerel siteleri herkese açık paylaşma:
  - **Ngrok** (varsayılan)
  - **Expose**
  - **Cloudflare Tunnel (cloudflared)**
- Tek komutla paylaşım araçları arasında geçiş
- Herkese açık tünel URL'sini programatik olarak alma

### Framework Driver'ları

- **25 yerleşik driver** uygulama framework'ünüzü otomatik algılar
- Desteklenen: Laravel, WordPress, Symfony, Drupal, CakePHP, Magento 2, Craft CMS, Statamic, Joomla, Kirby, TYPO3, Neos, Nette, Contao, Concrete5, Jigsaw, Sculpin, Katana, Bedrock, Radicle ve dahası
- **Özel driver API** - üç metot implement ederek herhangi bir PHP uygulaması için kendi driver'ınızı yazın
- Driver önceliği: Özel > Belirli > Varsayılan (BasicWithPublic, Basic)

### Sistem Entegrasyonu

- **Homebrew-native** - tüm servisler `brew services` ile kurulur ve yönetilir
- **Sudoers entegrasyonu** - `berkan trust` tekrarlanan `sudo` şifresi ihtiyacını ortadan kaldırır
- Yeniden başlatmalar arasında kalıcı özel loopback adresleri için **Loopback plist**
- **PATH'e symlink** - kurulumdan sonra `berkan` her yerden erişilebilir

### Tanı ve Loglama

- `berkan status` - web sunucu, PHP-FPM, DnsMasq ve veritabanı durumunu tek bakışta görün
- `berkan diagnose` - kapsamlı tanı raporu
- `berkan log` - web sunucu, PHP, PHP-FPM veya erişim loglarını canlı takip edin
- `~/.config/berkan/Log/` içinde servis başına ayrı log dosyaları

## Gereksinimler

- **macOS** (Apple Silicon veya Intel)
- **Homebrew** ve **Composer** (aşağıdaki adımlarda kurulur)
- Port 80/443 varsayılan olarak kullanılır, ancak bu portlar doluysa kurulum sırasında **özel portlar** seçilebilir

## Kurulum

### Adım 1: Homebrew Kurulumu

Homebrew kurulu değilse:



### Adım 2: PHP ve Composer Kurulumu



### Adım 3: Berkan Kurulumu



> **Not:** Composer'ın global vendor bin dizininin `PATH`'inizde olduğundan emin olun. Shell profilinize (`~/.zshrc` veya `~/.bashrc`) aşağıdakilerden birini ekleyin:
> 
> Ardından terminalinizi yeniden başlatın veya `source ~/.zshrc` çalıştırın.

### Adım 4: Berkan Servislerini Kurun



Bu, sizi kurulum boyunca yönlendirecek interaktif bir kurucu başlatır. Homebrew, PHP ve Composer'ı otomatik kontrol eder — eksik olanları kurar.

**1. Web Sunucu Seçimi:**

- **Apache** - `.htaccess` dosyaları kullanıyorsanız en iyi seçim (Laravel, WordPress, vb.)
- **Nginx** - Yüksek performanslı event-driven mimari istiyorsanız en iyi seçim

**2. PHP Versiyon Seçimi (çoklu seçim):**

Bir veya daha fazla PHP versiyonu seçin. Seçtiğiniz en son versiyon aktif versiyon olarak ayarlanacaktır. Eski versiyonlar (5.6–8.0) `shivammathur/php` Homebrew tap'ı ile kurulur (otomatik eklenir).

**3. Veritabanı Seçimi (çoklu seçim):**

İhtiyacınız olan veritabanlarını seçin veya atlamak için "None" seçin. Veritabanlarını daha sonra `berkan db:install` ile istediğiniz zaman kurabilirsiniz.

**4. Port Yapılandırması (otomatik):**

Port 80 veya 443 başka bir işlem tarafından kullanılıyorsa Berkan çakışmayı algılar ve alternatif portlar sunar:

Çakışma yoksa Berkan sessizce varsayılan 80/443 portlarını kullanır. Özel portlar `config.json`'a kaydedilir ve tüm sunucu konfigürasyonları otomatik güncellenir.

### Adım 5: Berkan'ı Güvenilir Yapın (Önerilen)

Bu adım Berkan'ı sudoers'a ekler, böylece `start`, `stop`, `restart`, `secure` gibi yaygın komutlarda şifre girmeniz gerekmez:



### Adım 6: Kurulumu Doğrulayın



Tüm servislerin çalıştığını görmelisiniz:



Her şeyin doğru yapılandırıldığından emin olmak için tanı aracını çalıştırın:



### Adım 7: Projeler Dizininizi Park Edin



Berkan dizini tarayacak, her projenin framework'ünü algılayacak ve her proje için hangi PHP versiyonunun kullanılacağını interaktif olarak soracaktır:



Belirli bir PHP versiyonu atanan projeler kendi PHP-FPM havuzu ve soketi ile izole edilir. "Default" seçilen projeler global PHP versiyonunu kullanır.

Artık `~/Sites/` içinde oluşturduğunuz her klasör tarayıcınızda otomatik olarak `http://klasör-adı.test` olarak erişilebilir olacaktır.

### `berkan install` Ne Yapar? (Adım Adım)

1. **Homebrew kontrolü** — kurulu değilse resmi Homebrew kurucusunu otomatik çalıştırır
2. **Composer kontrolü** — kurulu değilse Homebrew ile kurar
3. Web sunucu (Apache veya Nginx), PHP versiyonları ve veritabanları seçmenizi ister
4. **Port çakışmalarını algılar** (80/443) ve gerekirse alternatif port seçmenizi sağlar
5. `~/.config/berkan/` konfigürasyon dizinini oluşturur
6. Alt dizinleri oluşturur: `Apache/` veya `Nginx/`, `Certificates/`, `Drivers/`, `Sites/`, `Log/`, `dnsmasq.d/`
7. Seçimlerinizi (port yapılandırması dahil) `~/.config/berkan/config.json` dosyasına kaydeder
8. Seçilen web sunucuyu Homebrew ile kurar (kurulu değilse)
9. Ana sunucu konfigürasyonunu yapılandırılmış portlarla yazar (Apache için `httpd.conf` veya Nginx için `nginx.conf`)
10. Varsayılan catch-all sunucu konfigürasyonunu oluşturur (tüm `.test` isteklerini `server.php`'ye yönlendirir)
11. PHP-FPM'i Unix socket kullanan bir `berkan` havuzuyla yapılandırır (`~/.config/berkan/berkan.sock`)
12. Seçtiğiniz ek PHP versiyonlarını Homebrew ile kurar (eski versiyonlar için `shivammathur/php` tap eklenir)
13. DnsMasq'i tüm `*.test` alan adlarını `127.0.0.1`'e çözümlemek için kurar ve yapılandırır
14. `/etc/resolver/test` macOS resolver dosyasını oluşturur
15. Seçilen veritabanlarını Homebrew ile kurar ve başlatır
16. Tüm servisleri başlatır (`brew services start`)
17. `berkan` çalıştırılabilir dosyasını `/usr/local/bin/berkan` olarak symlink'ler
18. Örnek bir özel driver'ı `~/.config/berkan/Drivers/` dizinine kopyalar

### Berkan'ı Güncelleme



### Alternatif: Manuel Kurulum

Kaynak koddan kurmayı tercih ederseniz:



Manuel kurulumu güncellemek için:



## Hızlı Başlangıç



Bu kadar! `~/Sites/` içindeki her klasör artık otomatik olarak `http://klasor-adi.test` adresinde erişime açıktır. Eski projeler modern projelerle yan yana farklı PHP versiyonları çalıştırabilir.

## Komut Referansı

### Servis Yönetimi

| Komut | Açıklama |
|-------|----------|
| `berkan install` | Berkan servislerini kur (interaktif web sunucu, PHP, veritabanı seçimi) |
| `berkan uninstall` | Berkan'ı kaldır (onay ister) |
| `berkan uninstall --force` | Zorla kaldır ve tüm konfigürasyonları sil |
| `berkan start` | Tüm Berkan servislerini başlat |
| `berkan stop` | Tüm Berkan servislerini durdur |
| `berkan restart` | Tüm Berkan servislerini yeniden başlat |
| `berkan status` | Servis durumu tablosunu göster |
| `berkan trust` | Berkan'ı sudoers'a ekle (artık şifre sorulmaz) |

### Site Yönetimi

| Komut | Açıklama |
|-------|----------|
| `berkan park [yol]` | Dizini interaktif proje tarama ve proje başına PHP versiyon seçimiyle park et |
| `berkan parked` | Tüm park edilmiş dizinleri listele |
| `berkan forget [yol]` | Park edilmiş yolu kaldır |
| `berkan link [isim]` | Mevcut dizin için sembolik bağlantı oluştur |
| `berkan links` | Tüm bağlantılı siteleri SSL durumu, URL'leri ve PHP versiyonlarıyla listele |
| `berkan unlink [isim]` | Bağlantılı siteyi kaldır |
| `berkan open [isim]` | Siteyi varsayılan tarayıcıda aç |
| `berkan paths` | Tüm kayıtlı yolları göster |

### HTTPS / SSL

| Komut | Açıklama |
|-------|----------|
| `berkan secure [isim]` | Kendinden imzalı güvenilir sertifika ile HTTPS etkinleştir |
| `berkan secured` | Tüm güvenli siteleri listele |
| `berkan unsecure [isim]` | HTTPS'i kaldırıp HTTP'ye geri dön |

### PHP Yönetimi

| Komut | Açıklama |
|-------|----------|
| `berkan use <versiyon>` | Global PHP versiyonunu değiştir (ör. `berkan use 8.3`) |
| `berkan php:install <versiyon>` | Yeni PHP versiyonu kur (ör. `berkan php:install 8.2`) |
| `berkan php:remove <versiyon>` | PHP versiyonu kaldır |
| `berkan php:list` | Kurulu PHP versiyonlarını durumlarıyla listele |
| `berkan which-php` | Aktif PHP versiyonunu göster |
| `berkan php [argümanlar...]` | Berkan'ın PHP versiyonuyla PHP CLI çalıştır |
| `berkan composer [argümanlar...]` | Berkan'ın PHP versiyonuyla Composer çalıştır |
| `berkan isolate <versiyon>` | Mevcut siteyi belirli bir PHP versiyonuna izole et |
| `berkan unisolate` | Mevcut siteden PHP izolasyonunu kaldır |
| `berkan isolated` | Tüm izole edilmiş siteleri ve PHP versiyonlarını listele |

### Veritabanı Yönetimi

| Komut | Açıklama |
|-------|----------|
| `berkan db:install <isim>` | Veritabanı kur (`mysql`, `postgresql`, `mongodb`, `redis`) |
| `berkan db:uninstall <isim>` | Veritabanı kaldır |
| `berkan db:start [isim]` | Veritabanı başlat (veya tüm kurulu veritabanlarını) |
| `berkan db:stop [isim]` | Veritabanı durdur (veya tümünü) |
| `berkan db:restart [isim]` | Veritabanı yeniden başlat (veya tümünü) |
| `berkan db:list` | Tüm desteklenen veritabanlarını ve durumlarını listele |

### Web Sunucu

| Komut | Açıklama |
|-------|----------|
| `berkan server:switch` | Apache ve Nginx arasında geçiş yap |

### Proxy

| Komut | Açıklama |
|-------|----------|
| `berkan proxy <isim> <url>` | Proxy oluştur (ör. `berkan proxy myapi http://localhost:3000`) |
| `berkan proxy <isim> <url> --secure` | HTTPS ile proxy oluştur |
| `berkan proxies` | Tüm proxy siteleri listele |
| `berkan unproxy <isim>` | Proxy'i kaldır |

### Paylaşım

| Komut | Açıklama |
|-------|----------|
| `berkan share [isim]` | Siteyi tünel üzerinden herkese açık paylaş |
| `berkan share-tool [araç]` | Paylaşım aracını al veya ayarla (`ngrok`, `expose`, `cloudflared`) |
| `berkan fetch-share-url` | Mevcut paylaşım URL'sini al |
| `berkan set-ngrok-token <token>` | Ngrok kimlik doğrulama token'ını ayarla |

### Konfigürasyon

| Komut | Açıklama |
|-------|----------|
| `berkan tld [isim]` | TLD'yi al veya ayarla (varsayılan: `test`) |
| `berkan loopback [adres]` | Loopback IP'yi al veya ayarla (varsayılan: `127.0.0.1`) |
| `berkan directory-listing [on/off]` | Dizin listelemeyi aç/kapat |
| `berkan shorttag on` | Tüm PHP versiyonlarında `short_open_tag` etkinleştir (`<?` sözdizimi) |
| `berkan shorttag off` | Tüm PHP versiyonlarında `short_open_tag` devre dışı bırak |
| `berkan shorttag` | Mevcut `short_open_tag` durumunu göster |
| `berkan error hide` | Tüm sitelerde PHP hatalarını gizle (notice, warning, deprecation) |
| `berkan error show` | Tüm sitelerde PHP hatalarını göster |
| `berkan on-latest-version` | Mevcut Berkan versiyonunu göster |

### Tanı

| Komut | Açıklama |
|-------|----------|
| `berkan diagnose` | Tam tanı çalıştır ve sonuçları göster |
| `berkan log [servis]` | Logları görüntüle (`apache`/`nginx`, `php`, `php-fpm`, `access`) |
| `berkan log` | Tüm mevcut log dosyalarını listele |

## Site Sunma

Berkan, PHP projelerinizi sunmak için iki yol destekler:

### `park` Komutu

`park` komutu bir dizini kaydeder ve interaktif olarak projeleri tarar. Park edilmiş dizin içindeki her alt klasör otomatik olarak `.test` sitesi olarak erişilebilir hale gelir.



Berkan dizini tarayacak, her projenin framework'ünü algılayacak (Laravel, Symfony, WordPress, Drupal, Magento 2, Craft CMS, Joomla, Composer, Plain PHP, vb.) ve hangi PHP versiyonunun atanacağını soracaktır:



Belirli bir PHP versiyonu atanan her proje, kendi soketi ile izole bir PHP-FPM havuzu alır (ör. `berkan-7.4.sock`). Bu sayede farklı projeler tamamen farklı PHP versiyonlarını aynı anda çalıştırabilir.



Birden fazla dizin park edebilirsiniz:



Bir dizini sunmayı durdurmak için:



### `link` Komutu

`link` komutu tek bir site için sembolik bağlantı oluşturur. Bu, park edilmemiş bir konumdaki tek bir dizini sunmak istediğinizde veya site adının klasör adından farklı olması gerektiğinde kullanışlıdır.







### İstek Yönlendirme Nasıl Çalışır?

**Apache:**
1. `myapp.test` için bir istek Apache'ye ulaşır
2. Sitenin `.htaccess` rewrite kuralları önce çalışır (varsa)
3. Hiçbir `.htaccess` kuralı eşleşmediyse, Berkan'ın yedek kuralı eşleşmeyen istekleri `server.php`'ye yönlendirir (`RewriteOptions InheritDown` ile)
4. `server.php` ana bilgisayar adından site adını çıkarır
5. Driver sistemi framework'ü otomatik algılar (Laravel, WordPress, vb.)
6. Uygun ön denetleyici (front controller) yüklenir ve çalıştırılır

**Nginx:**
1. `myapp.test` için bir istek Nginx'e ulaşır
2. Server bloğu isteği `server.php`'ye yönlendirir
3. `server.php` ana bilgisayar adından site adını çıkarır
4. Eşleşen bağlantılı site veya park edilmiş dizini arar
5. Driver sistemi framework'ü otomatik algılar
6. Uygun ön denetleyici yüklenir ve çalıştırılır

> **Not:** Apache, projenizin `.htaccess` kurallarının Berkan'ın yedek yönlendirmesinden her zaman öncelikli olmasını sağlamak için `RewriteOptions InheritDown` kullanır. Bu sayede özel rewrite kuralları olan geleneksel PHP siteleri (ör. çokdilli yönlendirme `/tr/subeler.php`) herhangi bir değişiklik yapılmadan doğal olarak çalışır.

## HTTPS / SSL Desteği

Berkan, tek bir komutla herhangi bir siteyi güvenilir kendinden imzalı TLS sertifikası ile güvenli hale getirebilir. Apache veya Nginx kullanmanızdan bağımsız olarak aynı şekilde çalışır.

### Siteyi Güvenli Hale Getirme



Bu işlem şunları yapar:
1. 2048-bit RSA özel anahtarı oluşturur
2. SAN (Subject Alternative Name) ile kendinden imzalı sertifika oluşturur
3. Sertifikayı macOS Sistem Anahtarlığı'nda güvenilir hale getirir
4. Uygun web sunucu konfigürasyonunu oluşturur (Apache VirtualHost veya Nginx server bloğu)
5. HTTP'den HTTPS'ye yönlendirme ayarlar
6. HTTP/2 desteğini etkinleştirir
7. HSTS başlığını ekler
8. Web sunucuyu yeniden başlatır

### Güvenliği Kaldırma



Bu, sertifikayı siler, Anahtarlık'tan çıkarır ve SSL konfigürasyonunu kaldırır.

### Güvenli Siteleri Listeleme



## PHP Versiyon Yönetimi

Berkan, **PHP 5.6'dan 8.4'e** kadar tüm versiyonları destekler. 8.1–8.4 versiyonları standart Homebrew formülünden gelir. Eski versiyonlar (5.6–8.0) `shivammathur/php` tap'ı tarafından sağlanır ve gerektiğinde Berkan otomatik olarak ekler.

### Desteklenen PHP Versiyonları

| Versiyon | Kaynak | Formül |
|----------|--------|--------|
| PHP 8.4 | Homebrew | `php` veya `[email protected]` |
| PHP 8.3 | Homebrew | `[email protected]` |
| PHP 8.2 | Homebrew | `[email protected]` |
| PHP 8.1 | Homebrew | `[email protected]` |
| PHP 8.0 | shivammathur/php | `[email protected]` |
| PHP 7.4 | shivammathur/php | `[email protected]` |
| PHP 7.3 | shivammathur/php | `[email protected]` |
| PHP 7.2 | shivammathur/php | `[email protected]` |
| PHP 7.1 | shivammathur/php | `[email protected]` |
| PHP 7.0 | shivammathur/php | `[email protected]` |
| PHP 5.6 | shivammathur/php | `[email protected]` |

### Global PHP Değiştirme



### PHP Versiyonlarını Kurma ve Kaldırma



### Site Bazında PHP İzolasyonu

Tek tek siteleri farklı PHP versiyonları kullanacak şekilde izole edebilirsiniz. Her izole site kendi PHP-FPM havuzu ve soketini alır:



### `berkan park` ile Proje Bazında PHP

`berkan park` çalıştırdığınızda, Berkan dizini tarar ve proje başına PHP versiyonunu interaktif olarak atamanızı sağlar. Detaylar için [`park` Komutu](#park-komutu) bölümüne bakın.

### PHP CLI Kullanımı



## Veritabanı Yönetimi

Berkan, CLI üzerinden doğrudan veritabanlarını kurabilir ve yönetebilir.

### Desteklenen Veritabanları

| Veritabanı | Kurulum Komutu | Formül |
|------------|----------------|---------|
| MySQL | `berkan db:install mysql` | `mysql` |
| PostgreSQL | `berkan db:install postgresql` | `postgresql@17` |
| MongoDB | `berkan db:install mongodb` | `mongodb-community` |
| Redis | `berkan db:install redis` | `redis` |

### Veritabanı Kurma



MongoDB için `mongodb/brew` tap'ı gereklidir, bunu Berkan otomatik olarak halleder.

### Veritabanlarını Yönetme

```bash
# Belirli bir veritabanını başlat
sudo berkan db:start mysql

# Tüm veritabanlarını durdur
sudo berkan db:stop

# PostgreSQL'i yeniden başlat
sudo berkan db:restart postgresql

# Veritabanı kaldır
sudo berkan db:uninstall mongodb
```

### Veritabanı Durumunu Kontrol Etme

```bash
berkan db:list

# Çıktı:
# +------------+------------+-----------+---------------+
# | Database   | Label      | Installed | Status        |
# +------------+------------+-----------+---------------+
# | mysql      | MySQL      | Yes       | Running       |
# | postgresql | PostgreSQL | Yes       | Running       |
# | mongodb    | MongoDB    | No        | Not Installed |
# | redis      | Redis      | Yes       | Stopped       |
# +------------+------------+-----------+---------------+
```

Kurulu veritabanları `berkan status` içinde de görünür:

```
+----------------+---------+
| Service        | Status  |
+----------------+---------+
| Apache (httpd) | Running |
| PHP-FPM        | Running |
| DnsMasq        | Running |
| MySQL          | Running |
| PostgreSQL     | Running |
+----------------+---------+
```

## Web Sunucu Seçimi

### Kurulum Sırasında Seçim

`sudo berkan install` çalıştırdığınızda, Berkan hangi web sunucuyu istediğinizi sorar:

```
Which web server would you like to use?
  [0] Apache
  [1] Nginx
```

### Web Sunucuları Arasında Geçiş

Apache ve Nginx arasında istediğiniz zaman geçiş yapabilirsiniz:

```bash
sudo berkan server:switch
```

Bu işlem şunları yapar:
1. Geçişi onaylar (ör. "Apache'den Nginx'e geçilsin mi?")
2. Mevcut web sunucuyu durdurur
3. Konfigürasyonu günceller
4. Yeni web sunucuyu kurar ve yapılandırır
5. Sudoers kayıtlarını günceller
6. Yeni web sunucuyu başlatır

Geçiş sonrasında tüm siteleriniz, sertifikalarınız ve konfigürasyonlarınız sorunsuz çalışmaya devam eder.

### Apache ve Nginx Arasındaki Farklar

| Özellik | Apache | Nginx |
|---------|--------|-------|
| `.htaccess` desteği | Native | Desteklenmiyor |
| Konfig test komutu | `apachectl configtest` | `nginx -t` |
| Konfig dizini | `~/.config/berkan/Apache/` | `~/.config/berkan/Nginx/` |
| Log ön eki | `apache-error.log` | `nginx-error.log` |
| PHP bağlantısı | `mod_proxy_fcgi` (Unix soket) | `fastcgi_pass` (Unix soket) |
| Proxy desteği | `mod_proxy_http` | `proxy_pass` |

## Site Proxy

Berkan, `.test` alan adlarını Node.js, Go, Python veya Docker container'ları gibi diğer yerel servislere yönlendirebilir.

```bash
# myapi.test'i port 3000'deki bir Node.js uygulamasına yönlendir
sudo berkan proxy myapi http://localhost:3000

# HTTPS ile proxy
sudo berkan proxy myapi http://localhost:3000 --secure

# Tüm proxy'leri listele
berkan proxies
# +-------------+------------------------+
# | Site        | Proxy URL              |
# +-------------+------------------------+
# | myapi.test  | http://localhost:3000   |
# +-------------+------------------------+

# Proxy'i kaldır
sudo berkan unproxy myapi
```

Proxy konfigürasyonları hem Apache hem de Nginx için WebSocket desteği içerir.

## Site Paylaşımı

Berkan, yerel siteleri herkese açık paylaşmak için üç tünel aracı destekler:

### Ngrok Kullanımı (Varsayılan)

```bash
# Ngrok kimlik doğrulama token'ını ayarla (bir kez)
berkan set-ngrok-token TOKEN_INIZ

# Siteyi paylaş
berkan share myapp

# Başka bir terminalde URL'yi al
berkan fetch-share-url
```

### Expose Kullanımı

```bash
berkan share-tool expose
berkan share myapp
```

### Cloudflare Tunnel Kullanımı

```bash
berkan share-tool cloudflared
berkan share myapp
```

### Mevcut Aracı Kontrol Etme

```bash
berkan share-tool
# Çıktı: Current share tool: ngrok
```

## Özel Driver Yazma

Berkan uygulamanızı otomatik algılamıyorsa, özel bir driver yazabilirsiniz.

### Driver Oluşturma

Kurulum sırasında `~/.config/berkan/Drivers/SampleBerkanDriver.php` adresine örnek bir driver yerleştirilir. Bu dizinde yeni bir dosya oluşturun:



> **Not:** `isStaticFile()` metodu PHP 7.x izole sitelerle uyumluluk için return type bildirimi içermez. Bunun yerine `@return` docblock kullanın.

### Driver Çözümleme Sırası

1. **Özel driver'lar** - `~/.config/berkan/Drivers/` dizininde (en yüksek öncelik)
2. **Belirli driver'lar** - WordPress, Laravel, Symfony, vb.
3. **Varsayılan driver'lar** - `BasicWithPublicBerkanDriver`, `BasicBerkanDriver`

`serves()` metodu `true` döndüren ilk driver isteği yönetir.

## Desteklenen Framework'ler

Berkan, **25 framework ve CMS platformu** için yerleşik driver içerir:

| Framework | Algılama |
|-----------|----------|
| **Laravel** | `artisan` veya `bootstrap/app.php` + `public/index.php` |
| **WordPress** | `wp-config.php` + `wp-admin/` |
| **WordPress Bedrock** | `web/wp/wp-settings.php` |
| **Symfony** | `bin/console` + `public/index.php` |
| **Drupal** | `core/lib/Drupal.php` |
| **Joomla** | `configuration.php` + `libraries/` |
| **CakePHP** | `config/app.php` + `webroot/index.php` |
| **Magento 2** | `bin/magento` + `pub/index.php` |
| **Craft CMS** | `craft` dosyası |
| **Statamic v3+** | Laravel + composer.json'da `statamic/cms` |
| **Statamic v2** | `statamic/` dizini + `please` dosyası |
| **Statamic v1** | `_app/core/statamic.php` |
| **Kirby CMS** | `kirby/` dizini |
| **Contao** | `system/initialize.php` veya `vendor/contao/` |
| **Concrete5** | `concrete/dispatcher.php` |
| **TYPO3** | `typo3/` dir + `typo3conf/` veya `config/system/settings.php` |
| **Neos CMS** | `flow` dosyası |
| **Nette** | `app/bootstrap.php` + `www/index.php` |
| **Jigsaw** | `build_local/` dizini |
| **Sculpin** | `output_dev/` veya `output_prod/` dizini |
| **Katana** | `public/_katana/` dizini |
| **Radicle** | `web/wp/wp-settings.php` + `config/application.php` |
| **Public dizinli temel** | `public/` dizini olan herhangi bir proje |
| **Temel** | Herhangi bir PHP projesi için yedek driver |

## Konfigürasyon

### Konfigürasyon Dosyası

Ana konfigürasyon dosyası `~/.config/berkan/config.json` adresindedir:

```json
{
    "tld": "test",
    "loopback": "127.0.0.1",
    "http_port": "80",
    "https_port": "443",
    "paths": [
        "/Users/siz/Sites",
        "/Users/siz/Projects"
    ],
    "web_server": "apache",
    "php_versions": ["8.4", "8.3", "7.4"],
    "databases": ["mysql", "redis"],
    "isolated_versions": {
        "eski-proje": "[email protected]",
        "eski-wordpress": "[email protected]"
    },
    "hide_errors": false,
    "short_open_tag": false