Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion docs/tr/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,27 +122,40 @@ sudo systemctl start frankenphp
## Docs

- [Worker modu](worker.md)
- [Classic mod](classic.md)
- [Early Hints desteği (103 HTTP durum kodu)](early-hints.md)
- [Real-time](mercure.md)
- [Günlük kaydı](logging.md)
- [Büyük statik dosyaları verimli sunma](x-sendfile.md)
- [Konfigürasyon](config.md)
- [Docker imajları](docker.md)
- [Production'a dağıtım](production.md)
- [**Bağımsız** kendiliğinden çalıştırılabilir PHP uygulamaları oluşturma](embed.md)
- [Statik binary'leri oluşturma](static.md)
- [Kaynak dosyalarından derleme](config.md)
- [Gözlemlenebilirlik](observability.md)
- [Metrikler](metrics.md)
- [Nginx/PHP-FPM'den geçiş](migrate.md)
- [Güvenlik modeli](security.md)
- [WordPress entegrasyonu](wordpress.md)
- [Symfony entegrasyonu](symfony.md)
- [Laravel entegrasyonu](laravel.md)
- [Yii 3 entegrasyonu](yii3.md)
- [Bilinen sorunlar](known-issues.md)
- [Demo uygulama (Symfony) ve kıyaslamalar](https://github.com/dunglas/frankenphp-demo)
- [Go kütüphanesi olarak kullanma](library.md)
- [Go kütüphane dokümantasonu](https://pkg.go.dev/github.com/dunglas/frankenphp)
- [Katkıda bulunma ve hata ayıklama](CONTRIBUTING.md)
- [İç yapı (mimariye genel bakış)](internals.md)

## Örnekler ve iskeletler

- [Symfony](https://github.com/dunglas/symfony-docker)
- [Symfony](symfony.md)
- [API Platform](https://api-platform.com/docs/distribution/)
- [Laravel](https://frankenphp.dev/docs/laravel/)
- [Sulu](https://sulu.io/blog/running-sulu-with-frankenphp)
- [WordPress](https://github.com/StephenMiracle/frankenwp)
- [Yii 3](yii3.md)
- [Drupal](https://github.com/dunglas/frankenphp-drupal)
- [Joomla](https://github.com/alexandreelise/frankenphp-joomla)
- [TYPO3](https://github.com/ochorocho/franken-typo3)
Expand Down
11 changes: 11 additions & 0 deletions docs/tr/classic.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Classic modu kullanma

Ek bir yapılandırma olmadan FrankenPHP klasik modda çalışır. Bu modda FrankenPHP, PHP dosyalarını doğrudan sunan geleneksel bir PHP sunucusu gibi davranır. Bu da onu PHP-FPM veya Apache + mod_php için kesintisiz bir yerine geçen çözüm haline getirir.

Caddy'ye benzer şekilde FrankenPHP sınırsız sayıda bağlantı kabul eder ve bunları [sabit sayıda iş parçacığı](config.md#caddyfile-config) ile karşılar. Kabul edilen ve kuyruğa alınan bağlantı sayısı yalnızca mevcut sistem kaynaklarıyla sınırlıdır.
PHP iş parçacığı havuzu, başlangıçta sabit sayıda iş parçacığıyla çalışır; bu, PHP-FPM'nin static moduna benzer. İş parçacıklarının [çalışma zamanında otomatik ölçeklenmesine](performance.md#max_threads) izin vermek de mümkündür; bu da PHP-FPM'nin dynamic moduna benzer.

Kuyruktaki bağlantılar, bir PHP iş parçacığı müsait olana kadar süresiz bekler. Bunu önlemek için FrankenPHP'nin genel yapılandırmasındaki max_wait_time [ayarını](config.md#caddyfile-config) kullanarak, bir isteğin boş bir PHP iş parçacığı için reddedilmeden önce ne kadar bekleyebileceğini sınırlayabilirsiniz.
Ayrıca Caddy'de makul bir [yazma zaman aşımı](https://caddyserver.com/docs/caddyfile/options#timeouts) ayarlayabilirsiniz.

Her Caddy örneği yalnızca bir FrankenPHP iş parçacığı havuzu başlatır; bu havuz tüm `php_server` blokları arasında paylaşılır.
250 changes: 250 additions & 0 deletions docs/tr/internals.md

Large diffs are not rendered by default.

64 changes: 64 additions & 0 deletions docs/tr/library.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# FrankenPHP'yi bir Go kütüphanesi olarak kullanma

FrankenPHP yalnızca bir Caddy modülü değildir: PHP betiklerini `net/http` ile çalıştırmak için herhangi bir Go programına kütüphane olarak gömülebilir.

Derleme gereksinimleri [FrankenPHP'yi kaynaktan derlemek](compile.md) ile aynıdır: embed SAPI ve ZTS etkin bir PHP ve eşleşen CGO bayrakları.

## Başlarken

Bir `Server` oluşturun, FrankenPHP'yi başlatırken kaydedin ve bir `http.Handler` olarak kullanın:

Minimal bir örnek için [https://pkg.go.dev](https://pkg.go.dev/github.com/dunglas/frankenphp#example-ServeHTTP) adresine bakın.

`NewServer()`; worker'ları, metrikleri ve günlükleri bu sunucuya atamak için kullanılan insan tarafından okunabilir bir ad (boşsa kayıtta `server_<idx>` olur), belge kökü, yol ayırma sonekleri (varsayılan `[".php"]`), her isteğe sunulan ortam değişkenleri ve bir `*slog.Logger` (varsayılan olarak global logger) alır.

`Init()` PHP çalışma zamanını başlatır ve istek sunulmadan önce tam olarak bir kez çağrılmalıdır; `Shutdown()` onu durdurur. `Init()` öncesi veya `Shutdown()` sonrası `Server.ServeHTTP()` çağrısı `ErrNotRunning` döndürür. Aynı `*Server`, örneğin yapılandırmayı yeniden yüklemek için, bir `Shutdown()` sonrasında yeniden `Init()`'e geçilebilir.

## Birden fazla sunucu

Birden fazla sunucu aynı anda kaydedilebilir; her birinin kendi belge kökü, ortamı ve logger'ı vardır. Bu, Caddyfile'daki birden fazla `php_server` bloğunun yaptığını yansıtır:

```go
// Ayrı belge köklerine sahip iki sunucu kaydetme
api, _ := frankenphp.NewServer("api/public/")
admin, _ := frankenphp.NewServer("admin/public/")

err := frankenphp.Init(
frankenphp.WithServer(api),
frankenphp.WithServer(admin),
)
```

`api.ServeHTTP()` üzerinden sunulan istekler yalnızca o sunucunun yapılandırmasını (ve aşağıda görüleceği gibi worker'larını) görür.

## Worker'lar

[Worker betikleri](worker.md) `WithWorkers()` ile bildirilir. Bir worker `WithWorkerServerScope()` ile bir sunucuya kapsamlandırılabilir: yalnızca bu sunucu örneğinin işlediği istekler worker'a ulaşır. İstekler betik yoluna veya `WithWorkerMatcher()` ile kaydedilen özel bir eşleştiriciye göre eşleştirilir:

```go
// Worker'ları bir sunucuya kapsamlandırma
server, _ := frankenphp.NewServer("public/")

err := frankenphp.Init(
frankenphp.WithServer(server),
frankenphp.WithWorkers("app", "public/index.php", 4,
frankenphp.WithWorkerServerScope(server),
),
frankenphp.WithWorkers("api", "public/api.php", 2,
frankenphp.WithWorkerServerScope(server),
frankenphp.WithWorkerMatcher(func(r *http.Request) bool {
return strings.HasPrefix(r.URL.Path, "/api/")
}),
),
)
```

Sunucu kapsamı olmadan bildirilen worker'lar globaldir: herhangi bir sunucuda dosya yoluna göre eşleşirler. Global bir worker'ın eşleştireceği belirli bir istek kümesi olmadığından `WithWorkerMatcher()` ile global bir worker'ı birleştirmek bir yapılandırma hatasıdır ve `Init()` bunu reddeder.

## İstek başına seçenekler

`Server.ServeHTTP()`, tek bir istek için sunucu yapılandırmasını geçersiz kılmak üzere `RequestOption`'lar kabul eder; örn. `WithRequestDocumentRoot()`, `WithRequestSplitPath()`, `WithRequestEnv()` veya `WithRequestLogger()`.

## Server öncesi API ile uyumluluk

Paket düzeyindeki `frankenphp.ServeHTTP()` işlevi herhangi bir sunucu kaydetmeden çalışmaya devam eder: `frankenphp.NewRequestWithContext()` ile hazırlanan istekler, global yapılandırmayı taşıyan dahili bir yedek sunucuda yürütülür. Yeni kod açık `Server` örneklerini tercih etmelidir.
74 changes: 74 additions & 0 deletions docs/tr/logging.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Günlük kaydı

> [!TIP]
> Günlük kaydı, FrankenPHP'nin gözlemlenebilirlik öyküsünün bir parçasıdır. Gerçek zamanlı izleme ve metrikler dahil tam tablo için [Gözlemlenebilirlik](observability.md) sayfasına bakın.

FrankenPHP, [Caddy'nin günlük sistemiyle](https://caddyserver.com/docs/logging) sorunsuz entegre olur.
Standart PHP işlevleriyle mesaj kaydedebilir veya gelişmiş yapılandırılmış günlük yetenekleri için özel `frankenphp_log()` işlevini kullanabilirsiniz.

## `frankenphp_log()`

`frankenphp_log()` işlevi, yapılandırılmış günlükleri doğrudan PHP uygulamanızdan üretmenizi sağlar;
bu da Datadog, Grafana Loki veya Elastic gibi platformlara aktarımı ve OpenTelemetry desteğini kolaylaştırır.

Perde arkasında `frankenphp_log()`, zengin günlük özellikleri sunmak için [Go'nun `log/slog` paketini](https://pkg.go.dev/log/slog) sarmalar.

Bu günlükler şiddet düzeyini ve isteğe bağlı bağlam verisini içerir.

```php
function frankenphp_log(string $message, int $level = FRANKENPHP_LOG_LEVEL_INFO, array $context = []): void
```

### Parametreler

- **`message`**: Günlük mesajı dizesi.
- **`level`**: Günlüğün şiddet düzeyi. Herhangi bir tamsayı olabilir. Yaygın düzeyler için kolaylık sabitleri sağlanır: `FRANKENPHP_LOG_LEVEL_DEBUG` (`-4`), `FRANKENPHP_LOG_LEVEL_INFO` (`0`), `FRANKENPHP_LOG_LEVEL_WARN` (`4`) ve `FRANKENPHP_LOG_LEVEL_ERROR` (`8`). Varsayılan `FRANKENPHP_LOG_LEVEL_INFO`'dur.
- **`context`**: Günlük kaydına eklenecek ek verilerin ilişkisel dizisi.

### Örnek

```php
<?php

// Basit bir bilgilendirme mesajı kaydedin
frankenphp_log("Hello from FrankenPHP!");

// Bağlam verisiyle bir uyarı kaydedin
frankenphp_log(
"Memory usage high",
FRANKENPHP_LOG_LEVEL_WARN,
[
'current_usage' => memory_get_usage(),
'peak_usage' => memory_get_peak_usage(),
],
);

```

Günlükler görüntülendiğinde (ör. `docker compose logs` ile) çıktı yapılandırılmış JSON olarak görünür:

```json
{"level":"info","ts":1704067200,"logger":"frankenphp","msg":"Hello from FrankenPHP!"}
{"level":"warn","ts":1704067200,"logger":"frankenphp","msg":"Memory usage high","current_usage":10485760,"peak_usage":12582912}
```

## `error_log()`

FrankenPHP, standart `error_log()` işleviyle günlük kaydına da izin verir. `$message_type` parametresi `4` (SAPI) ise
bu mesajlar Caddy logger'ına yönlendirilir.

Varsayılan olarak `error_log()` ile gönderilen mesajlar yapılandırılmamış metin olarak işlenir.
Standart PHP kütüphanesine dayanan mevcut uygulamalar veya kütüphanelerle uyumluluk için kullanışlıdır.

### error_log() örneği

```php
error_log("Database connection failed", 4);
```

Bu, Caddy günlüklerinde görünür; çoğu zaman PHP'den geldiğini belirten bir önekle.

> [!TIP]
> Üretim ortamlarında daha iyi gözlemlenebilirlik için `frankenphp_log()` tercih edin;
> çünkü günlükleri düzeye göre (Debug, Error vb.) süzmenize
> ve günlük altyapınızda belirli alanları sorgulamanıza olanak tanır.
78 changes: 78 additions & 0 deletions docs/tr/metrics.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# Metrikler

> [!TIP]
> Gerçek zamanlı panolar ve üretim izlemesi dahil eksiksiz bir gözlemlenebilirlik kurulumu için [Gözlemlenebilirlik](observability.md) sayfasına bakın.

## Prometheus dışa aktarımı

[Caddy metrikleri](https://caddyserver.com/docs/metrics) etkinleştirildiğinde FrankenPHP şu metrikleri yayınlar:

- `frankenphp_total_threads`: Toplam PHP iş parçacığı sayısı.
- `frankenphp_busy_threads`: Şu anda bir isteği işleyen PHP iş parçacığı sayısı (çalışan worker'lar her zaman bir iş parçacığı tüketir).
- `frankenphp_queue_depth`: Kuyruğa alınmış olağan istek sayısı.
- `frankenphp_total_workers{worker="[worker_name]"}`: Toplam worker sayısı.
- `frankenphp_busy_workers{worker="[worker_name]"}`: Şu anda bir isteği işleyen worker sayısı.
- `frankenphp_worker_request_time{worker="[worker_name]"}`: Tüm worker'ların istekleri işlemek için harcadığı süre.
- `frankenphp_worker_request_count{worker="[worker_name]"}`: Tüm worker'ların işlediği istek sayısı.
- `frankenphp_ready_workers{worker="[worker_name]"}`: En az bir kez `frankenphp_handle_request` çağırmış worker sayısı.
- `frankenphp_worker_crashes{worker="[worker_name]"}`: Bir worker'ın beklenmedik şekilde sonlandığı sayı.
- `frankenphp_worker_restarts{worker="[worker_name]"}`: Bir worker'ın bilinçli olarak yeniden başlatıldığı sayı.
- `frankenphp_worker_queue_depth{worker="[worker_name]"}`: Kuyruğa alınmış istek sayısı.

Worker metriklerinde `[worker_name]` yer tutucusu Caddyfile'daki worker adıyla değiştirilir; aksi halde worker dosyasının mutlak yolu kullanılır.

## İş parçacığı durumu uç noktası

FrankenPHP, [Caddy admin API](https://caddyserver.com/docs/api) üzerinden bir `/frankenphp/threads` uç noktası yayınlar.
Tüm etkin PHP iş parçacıklarının JSON anlık görüntüsünü döndürür; hata ayıklama ve gözlemlenebilirlik araçları oluşturmak için kullanışlıdır.

```console
curl -s http://localhost:2019/frankenphp/threads | jq .
```

### Yanıt biçimi

Uç nokta şu yapıda bir JSON nesnesi döndürür:

```json
{
"ThreadDebugStates": [
{
"Index": 0,
"Name": "worker-/path/to/worker.php",
"State": "ready",
"IsWaiting": true,
"IsBusy": false,
"WaitingSinceMilliseconds": 1234,
"CurrentURI": "",
"CurrentMethod": "",
"RequestStartedAt": 0,
"RequestCount": 42,
"MemoryUsage": 2097152
}
],
"ReservedThreadCount": 3
}
```

### Alanlar

| Alan | Tür | Açıklama |
|---|---|---|
| `ReservedThreadCount` | integer | Otomatik ölçekleme için ayrılmış, henüz etkin olmayan iş parçacığı sayısı. |

`ThreadDebugStates` içindeki her girdi şunları içerir:

| Alan | Tür | Açıklama |
|---|---|---|
| `Index` | integer | İş parçacığının indisi. |
| `Name` | string | İş parçacığının adı (ör. worker dosya yolu). |
| `State` | string | İş parçacığının iç durumu (ör. `ready`, `shutting down`). |
| `IsWaiting` | boolean | İş parçacığının bir istek bekleyip beklemediği. |
| `IsBusy` | boolean | İş parçacığının şu anda bir isteği işleyip işlemediği. |
| `WaitingSinceMilliseconds` | integer | İş parçacığının milisaniye cinsinden ne kadar süredir boşta olduğu. İş parçacığı meşgulse `0`. |
| `CurrentURI` | string | Şu anda işlenen URI. İş parçacığı boştaysa boş. |
| `CurrentMethod` | string | Geçerli isteğin HTTP metodu (ör. `GET`, `POST`). İş parçacığı boştaysa boş. |
| `RequestStartedAt` | integer | Geçerli isteğin başladığı Unix zaman damgası (milisaniye). İş parçacığı boştaysa `0`. |
| `RequestCount` | integer | Bu iş parçacığının başladığından beri işlediği toplam istek sayısı. |
| `MemoryUsage` | integer | İş parçacığının geçerli PHP bellek kullanımı, bayt cinsinden. |
Loading
Loading