diff --git a/README.md b/README.md index 93a60dac77..84d96011d6 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Go to `https://localhost`, and enjoy! > [!TIP] > -> Do not attempt to use `https://127.0.0.1`. Use `localhost` and accept the self-signed certificate. +> Do not attempt to use `https://127.0.0.1`. Use `https://localhost` and accept the self-signed certificate. > Use the [`SERVER_NAME` environment variable](docs/config.md#environment-variables) to change the domain to use. ### Standalone Binary diff --git a/docs/cn/README.md b/docs/cn/README.md index 79168f182d..c24081d8f1 100644 --- a/docs/cn/README.md +++ b/docs/cn/README.md @@ -28,7 +28,7 @@ docker run -v $PWD:/app/public \ > [!TIP] > -> 不要尝试使用 `https://127.0.0.1`。使用 `localhost` 并接受自签名证书。 +> 不要尝试使用 `https://127.0.0.1`。使用 `https://localhost` 并接受自签名证书。 > 使用 [`SERVER_NAME` 环境变量](config.md#环境变量) 更改要使用的域。 ### 独立二进制 diff --git a/docs/cn/production.md b/docs/cn/production.md index 16d2681dee..b18a294d68 100644 --- a/docs/cn/production.md +++ b/docs/cn/production.md @@ -55,6 +55,7 @@ volumes: ``` > [!NOTE] +> > 前面的示例适用于生产用途。 > 在开发中,你可能希望使用挂载目录,不同的 PHP 配置和不同的 `SERVER_NAME` 环境变量值。 > @@ -104,7 +105,8 @@ DigitalOcean 域服务示例(“Networking” > “Domains”): ![在 DigitalOcean 上配置 DNS](../digitalocean-dns.png) -> [!NOTE] +> [!NOTE] +> > Let's Encrypt 是 FrankenPHP 默认用于自动生成 TLS 证书的服务,不支持使用裸 IP 地址。使用域名是使用 Let's Encrypt 的必要条件。 ## 部署 @@ -129,6 +131,7 @@ docker compose up -d --wait 去 `https://your-domain-name.example.com` 享受吧! > [!CAUTION] +> > Docker 有一个缓存层,请确保每个部署都有正确的构建,或者使用 --no-cache 选项重新构建项目以避免缓存问题。 ## 在多个节点上部署 diff --git a/docs/fr/README.md b/docs/fr/README.md index 580cd091ee..42e1761138 100644 --- a/docs/fr/README.md +++ b/docs/fr/README.md @@ -28,7 +28,7 @@ Rendez-vous sur `https://localhost`, c'est parti ! > [!TIP] > -> Ne tentez pas d'utiliser `https://127.0.0.1`. Utilisez localhost et acceptez le certificat auto-signé. +> Ne tentez pas d'utiliser `https://127.0.0.1`. Utilisez `https://localhost` et acceptez le certificat auto-signé. > Utilisez [la variable d'environnement `SERVER_NAME`](config.md#environment-variables) pour changer le domaine à utiliser. ### Binaire autonome diff --git a/docs/fr/production.md b/docs/fr/production.md index 163796c28e..8901f88595 100644 --- a/docs/fr/production.md +++ b/docs/fr/production.md @@ -53,7 +53,8 @@ volumes: caddy_config: ``` -> [!NOTE] +> [!NOTE] +> > Les exemples précédents sont destinés à une utilisation en production. > En développement, vous pourriez vouloir utiliser un volume, une configuration PHP différente et une valeur différente pour la variable d'environnement `SERVER_NAME`. > @@ -103,7 +104,8 @@ Exemple avec le service DigitalOcean Domains ("Networking" > "Domains") : ![Configurer les DNS sur DigitalOcean](../digitalocean-dns.png) -> [!NOTE] +> [!NOTE] +> > Let's Encrypt, le service utilisé par défaut par FrankenPHP pour générer automatiquement un certificat TLS, ne prend pas en charge l'utilisation d'adresses IP nues. L'utilisation d'un nom de domaine est obligatoire pour utiliser Let's Encrypt. ## Déploiement @@ -128,6 +130,7 @@ Votre serveur est opérationnel, et un certificat HTTPS a été automatiquement Rendez-vous sur `https://your-domain-name.example.com` ! > [!CAUTION] +> > Docker peut avoir une couche de cache, assurez-vous d'avoir la bonne version de build pour chaque déploiement ou reconstruisez votre projet avec l'option `--no-cache` pour éviter les problèmes de cache. ## Déploiement sur Plusieurs Nœuds diff --git a/docs/production.md b/docs/production.md index 8650b74fab..ecafccbfa9 100644 --- a/docs/production.md +++ b/docs/production.md @@ -54,7 +54,8 @@ volumes: caddy_config: ``` -> [!NOTE] +> [!NOTE] +> > The previous examples are intended for production usage. > In development, you may want to use a volume, a different PHP configuration and a different value for the `SERVER_NAME` environment variable. > @@ -104,7 +105,8 @@ Example with the DigitalOcean Domains service ("Networking" > "Domains"): ![Configuring DNS on DigitalOcean](digitalocean-dns.png) -> [!NOTE] +> [!NOTE] +> > Let's Encrypt, the service used by default by FrankenPHP to automatically generate a TLS certificate doesn't support using bare IP addresses. Using a domain name is mandatory to use Let's Encrypt. ## Deploying @@ -129,6 +131,7 @@ Your server is up and running, and a HTTPS certificate has been automatically ge Go to `https://your-domain-name.example.com` and enjoy! > [!CAUTION] +> > Docker can have a cache layer, make sure you have the right build for each deployment or rebuild your project with `--no-cache` option to avoid cache issue. ## Deploying on Multiple Nodes diff --git a/docs/tr/CONTRIBUTING.md b/docs/tr/CONTRIBUTING.md new file mode 100644 index 0000000000..2149de4159 --- /dev/null +++ b/docs/tr/CONTRIBUTING.md @@ -0,0 +1,203 @@ +# Katkıda Bulunmak + +## PHP Derleme + +### Docker ile (Linux) + +Geliştirme Ortamı için Docker İmajını Oluşturun: + +```console +docker build -t frankenphp-dev -f dev.Dockerfile . +docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -p 8080:8080 -p 443:443 -p 443:443/udp -v $PWD:/go/src/app -it frankenphp-dev +``` + +İmaj genel geliştirme araçlarını (Go, GDB, Valgrind, Neovim...) içerir. + +Docker sürümü 23.0'dan düşükse, derleme dockerignore [pattern issue](https://github.com/moby/moby/pull/42676) tarafından başarısız olur. Dizinleri `.dockerignore` dosyasına ekleyin. + +```patch + !testdata/*.php + !testdata/*.txt ++!caddy ++!C-Thread-Pool ++!internal +``` + +### Docker olmadan (Linux ve macOS) + +[Kaynaklardan derlemek için talimatları izleyin](https://frankenphp.dev/docs/compile/) ve `--debug` yapılandırma seçeneğini geçirin. + +## Test senaryolarını çalıştırma + +```console +go test -race -v ./... +``` + +## Caddy modülü + +FrankenPHP Caddy modülü ile Caddy'yi oluşturun: + +```console +cd caddy/frankenphp/ +go build +cd ../../ +``` + +Caddy'yi FrankenPHP Caddy modülü ile çalıştırın: + +```console +cd testdata/ +../caddy/frankenphp/frankenphp run +``` + +Sunucu `127.0.0.1:8080` adresini dinliyor: + +```console +curl -vk https://localhost/phpinfo.php +``` + +## Minimal test sunucusu + +Minimal test sunucusunu oluşturun: + +```console +cd internal/testserver/ +go build +cd ../../ +``` + +Test sunucusunu çalıştırın: + +```console +cd testdata/ +../internal/testserver/testserver +``` + +Sunucu `127.0.0.1:8080` adresini dinliyor: + +```console +curl -v http://127.0.0.1:8080/phpinfo.php +``` + +## Docker İmajlarını Yerel Olarak Oluşturma + +Bake (pişirme) planını yazdırın: + +```console +docker buildx bake -f docker-bake.hcl --print +``` + +Yerel olarak amd64 için FrankenPHP görüntüleri oluşturun: + +```console +docker buildx bake -f docker-bake.hcl --pull --load --set "*.platform=linux/amd64" +``` + +Yerel olarak arm64 için FrankenPHP görüntüleri oluşturun: + +```console +docker buildx bake -f docker-bake.hcl --pull --load --set "*.platform=linux/arm64" +``` + +FrankenPHP imajlarını arm64 ve amd64 için sıfırdan oluşturun ve Docker Hub'a gönderin: + +```console +docker buildx bake -f docker-bake.hcl --pull --no-cache --push +``` + +## Statik Derlemelerle Segmentasyon Hatalarında Hata Ayıklama + +1. FrankenPHP binary dosyasının hata ayıklama sürümünü GitHub'dan indirin veya hata ayıklama seçeneklerini kullanarak özel statik derlemenizi oluşturun: + + ```console + docker buildx bake \ + --load \ + --set static-builder.args.DEBUG_SYMBOLS=1 \ + --set "static-builder.platform=linux/amd64" \ + static-builder + docker cp $(docker create --name static-builder dunglas/frankenphp:static-builder):/go/src/app/dist/frankenphp-linux-$(uname -m) frankenphp + ``` + +2. Mevcut `frankenphp` sürümünüzü hata ayıklama FrankenPHP çalıştırılabilir dosyasıyla değiştirin +3. FrankenPHP'yi her zamanki gibi başlatın (alternatif olarak FrankenPHP'yi doğrudan GDB ile başlatabilirsiniz: `gdb --args ./frankenphp run`) +4. GDB ile sürece bağlanın: + + ```console + gdb -p `pidof frankenphp` + ``` + +5. Gerekirse, GDB kabuğuna `continue` yazın +6. FrankenPHP'nin çökmesini sağlayın +7. GDB kabuğuna `bt` yazın +8. Çıktıyı kopyalayın + +## GitHub Eylemlerinde Segmentasyon Hatalarında Hata Ayıklama + +1. `.github/workflows/tests.yml` dosyasını açın +2. PHP hata ayıklama seçeneklerini etkinleştirin + + ```patch + - uses: shivammathur/setup-php@v2 + # ... + env: + phpts: ts + + debug: true + ``` + +3. Konteynere bağlanmak için `tmate`i etkinleştirin + + ```patch + - + name: Set CGO flags + run: echo "CGO_CFLAGS=$(php-config --includes)" >> "$GITHUB_ENV" + + - + + run: | + + sudo apt install gdb + + mkdir -p /home/runner/.config/gdb/ + + printf "set auto-load safe-path /\nhandle SIG34 nostop noprint pass" > /home/runner/.config/gdb/gdbinit + + - + + uses: mxschmitt/action-tmate@v3 + ``` + +4. Konteynere bağlanın +5. `frankenphp.go` dosyasını açın +6. `cgosymbolizer`'ı etkinleştirin + + ```patch + - //_ "github.com/ianlancetaylor/cgosymbolizer" + + _ "github.com/ianlancetaylor/cgosymbolizer" + ``` + +7. Modülü indirin: `go get` +8. Konteynerde GDB ve benzerlerini kullanabilirsiniz: + + ```console + go test -c -ldflags=-w + gdb --args ./frankenphp.test -test.run ^MyTest$ + ``` + +9. Hata düzeltildiğinde, tüm bu değişiklikleri geri alın + +## Misc Dev Resources + +* [uWSGI içine PHP gömme](https://github.com/unbit/uwsgi/blob/master/plugins/php/php_plugin.c) +* [NGINX Unit'te PHP gömme](https://github.com/nginx/unit/blob/master/src/nxt_php_sapi.c) +* [Go (go-php) içinde PHP gömme](https://github.com/deuill/go-php) +* [Go'da PHP gömme (GoEmPHP)](https://github.com/mikespook/goemphp) +* [C++'da PHP gömme](https://gist.github.com/paresy/3cbd4c6a469511ac7479aa0e7c42fea7) +* [Sara Golemon tarafından PHP'yi Genişletme ve Yerleştirme](https://books.google.fr/books?id=zMbGvK17_tYC&pg=PA254&lpg=PA254#v=onepage&q&f=false) +* [TSRMLS_CC de neyin nesi?](http://blog.golemon.com/2006/06/what-heck-is-tsrmlscc-anyway.html) +* [Mac'te PHP gömme](https://gist.github.com/jonnywang/61427ffc0e8dde74fff40f479d147db4) +* [SDL bağları](https://pkg.go.dev/github.com/veandco/go-sdl2@v0.4.21/sdl#Main) + +## Docker ile İlgili Kaynaklar + +* [Pişirme (bake) dosya tanımı](https://docs.docker.com/build/customize/bake/file-definition/) +* [docker buildx build](https://docs.docker.com/engine/reference/commandline/buildx_build/) + +## Faydalı Komut + +```console +apk add strace util-linux gdb +strace -e 'trace=!futex,epoll_ctl,epoll_pwait,tgkill,rt_sigreturn' -p 1 +``` diff --git a/docs/tr/README.md b/docs/tr/README.md new file mode 100644 index 0000000000..11837b2e9d --- /dev/null +++ b/docs/tr/README.md @@ -0,0 +1,77 @@ +# FrankenPHP: PHP için Modern Uygulama Sunucusu + +

FrankenPHP

+ +FrankenPHP, [Caddy](https://caddyserver.com/) web sunucusunun üzerine inşa edilmiş PHP için modern bir uygulama sunucusudur. + +FrankenPHP, çarpıcı özellikleri sayesinde PHP uygulamalarınıza süper güçler kazandırır: [Early Hints*](https://frankenphp.dev/docs/early-hints/), [worker modu](https://frankenphp.dev/docs/worker/), [real-time yetenekleri](https://frankenphp.dev/docs/mercure/), otomatik HTTPS, HTTP/2 ve HTTP/3 desteği... + +FrankenPHP herhangi bir PHP uygulaması ile çalışır ve worker modu ile resmi entegrasyonları sayesinde Laravel ve Symfony projelerinizi her zamankinden daha performanslı hale getirir. + +FrankenPHP, PHP'yi `net/http` kullanarak herhangi bir uygulamaya yerleştirmek için bağımsız bir Go kütüphanesi olarak da kullanılabilir. + +[*Frankenphp.dev*](https://frankenphp.dev) adresinden ve bu slayt üzerinden daha fazlasını öğrenin: + +Slides + +## Başlarken + +### Docker + +```console +docker run -v $PWD:/app/public \ + -p 80:80 -p 443:443 -p 443:443/udp \ + dunglas/frankenphp +``` + +`https://localhost` adresine gidin ve keyfini çıkarın! + +> [!TIP] +> +> `https://127.0.0.1` kullanmaya çalışmayın. `https://localhost` kullanın ve kendinden imzalı sertifikayı kabul edin. +> Kullanılacak alan adını değiştirmek için [`SERVER_NAME` ortam değişkenini](docs/config.md#environment-variables) kullanın. + +### Binary Çıktısı + +Docker kullanmayı tercih etmiyorsanız, Linux ve macOS için bağımsız FrankenPHP binary dosyası sağlıyoruz +[PHP 8.3](https://www.php.net/releases/8.3/en.php) ve en popüler PHP eklentilerini de içermekte: [FrankenPHP](https://github.com/dunglas/frankenphp/releases) indirin + +Geçerli dizinin içeriğini başlatmak için çalıştırın: + +```console +./frankenphp php-server +``` + +Ayrıca aşağıdaki tek komut satırı ile de çalıştırabilirsiniz: + +```console +./frankenphp php-cli /path/to/your/script.php +``` + +## Docs + +* [Worker modu](https://frankenphp.dev/docs/worker/) +* [Early Hints desteği (103 HTTP durum kodu)](https://frankenphp.dev/docs/early-hints/) +* [Real-time](https://frankenphp.dev/docs/mercure/) +* [Konfigürasyon](https://frankenphp.dev/docs/config/) +* [Docker imajları](https://frankenphp.dev/docs/docker/) +* [Production'a dağıtım](docs/production.md) +* [**Bağımsız** kendiliğinden çalıştırılabilir PHP uygulamaları oluşturma](https://frankenphp.dev/docs/embed/) +* [Statik binary'leri oluşturma](https://frankenphp.dev/docs/static/) +* [Kaynak dosyalarından derleme](https://frankenphp.dev/docs/compile/) +* [Laravel entegrasyonu](https://frankenphp.dev/docs/laravel/) +* [Bilinen sorunlar](https://frankenphp.dev/docs/known-issues/) +* [Demo uygulama (Symfony) ve kıyaslamalar](https://github.com/dunglas/frankenphp-demo) +* [Go kütüphane dokümantasonu](https://pkg.go.dev/github.com/dunglas/frankenphp) +* [Katkıda bulunma ve hata ayıklama](https://frankenphp.dev/docs/contributing/) + +## Örnekler ve İskeletler + +* [Symfony](https://github.com/dunglas/symfony-docker) +* [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/dunglas/frankenphp-wordpress) +* [Drupal](https://github.com/dunglas/frankenphp-drupal) +* [Joomla](https://github.com/alexandreelise/frankenphp-joomla) +* [TYPO3](https://github.com/ochorocho/franken-typo3) diff --git a/docs/tr/compile.md b/docs/tr/compile.md new file mode 100644 index 0000000000..6c3c91db62 --- /dev/null +++ b/docs/tr/compile.md @@ -0,0 +1,104 @@ +# Kaynak Kodlardan Derleme + +Bu doküman, PHP'yi dinamik bir kütüphane olarak yükleyecek bir FrankenPHP yapısının nasıl oluşturulacağını açıklamaktadır. +Önerilen yöntem bu şekildedir. + +Alternatif olarak, [statik yapılar oluşturma](static.md) da mümkündür. + +## PHP'yi yükleyin + +FrankenPHP, PHP 8.2 ve üstü ile uyumludur. + +İlk olarak, [PHP'nin kaynaklarını edinin](https://www.php.net/downloads.php) ve bunları çıkarın: + +```console +tar xf php-* +cd php-*/ +``` + +Ardından, PHP'yi platformunuz için yapılandırın: + +### Linux + +```console +./configure \ + --enable-embed \ + --enable-zts \ + --disable-zend-signals \ + --enable-zend-max-execution-timers +``` + +Son olarak, PHP'yi derleyin ve kurun: + +```console +make -j$(nproc) +sudo make install +``` + +### Mac + +Yüklemek için [Homebrew](https://brew.sh/) paket yöneticisini kullanın +`libiconv`, `bison`, `re2c` ve `pkg-config`: + +```console +brew install libiconv bison re2c pkg-config +echo 'export PATH="/opt/homebrew/opt/bison/bin:$PATH"' >> ~/.zshrc +``` + +Ardından yapılandırma betiğini çalıştırın: + +```console +./configure \ + --enable-embed=static \ + --enable-zts \ + --disable-zend-signals \ + --disable-opcache-jit \ + --enable-static \ + --enable-shared=no \ + --with-iconv=/opt/homebrew/opt/libiconv/ +``` + +Bu şekilde yapılandırma gereklidir, ancak başka opsiyonlar da ekleyebilirsiniz (örn. ekstra uzantılar) +İhtiyaç halinde. + +Son olarak, PHP'yi derleyin ve yükleyin: + +```console +make -j$(sysctl -n hw.logicalcpu) +sudo make install +``` + +## Go Uygulamasını Derleyin + +Artık Go kütüphanesini kullanabilir ve Caddy yapımızı derleyebilirsiniz: + +```console +curl -L https://github.com/dunglas/frankenphp/archive/refs/heads/main.tar.gz | tar x +cd frankenphp-main/caddy/frankenphp +CGO_CFLAGS=$(php-config --includes) CGO_LDFLAGS="$(php-config --ldflags) $(php-config --libs)" go build +``` + +### Xcaddy kullanımı + +Alternatif olarak, FrankenPHP'yi [özel Caddy modülleri](https://caddyserver.com/docs/modules/) ile derlemek için [xcaddy](https://github.com/caddyserver/xcaddy) kullanın: + +```console +CGO_ENABLED=1 \ +XCADDY_GO_BUILD_FLAGS="-ldflags '-w -s'" \ +xcaddy build \ + --output frankenphp \ + --with github.com/dunglas/frankenphp/caddy \ + --with github.com/dunglas/mercure/caddy \ + --with github.com/dunglas/vulcain/caddy + # Add extra Caddy modules here +``` + +> [!TIP] +> +> Eğer musl libc (Alpine Linux'ta varsayılan) ve Symfony kullanıyorsanız, +> varsayılan yığın boyutunu artırmanız gerekebilir. +> Aksi takdirde, şu tarz hatalar alabilirsiniz `PHP Fatal error: Maximum call stack size of 83360 bytes reached during compilation. Try splitting expression` +> +> Bunu yapmak için, `XCADDY_GO_BUILD_FLAGS` ortam değişkenini bu şekilde değiştirin +> `XCADDY_GO_BUILD_FLAGS=$'-ldflags "-w -s -extldflags \'-Wl,-z,stack-size=0x80000\'"'` +> (yığın boyutunun değerini uygulamanızın ihtiyaçlarına göre değiştirin). diff --git a/docs/tr/config.md b/docs/tr/config.md new file mode 100644 index 0000000000..a2b089ae2d --- /dev/null +++ b/docs/tr/config.md @@ -0,0 +1,159 @@ +# Konfigürasyon + +FrankenPHP, Caddy'nin yanı sıra Mercure ve Vulcain modülleri [Caddy tarafından desteklenen formatlar](https://caddyserver.com/docs/getting-started#your-first-config) kullanılarak yapılandırılabilir. + +Docker imajında, `Caddyfile` `/etc/caddy/Caddyfile` dosyası olarak bulunur. + +PHP'yi her zamanki gibi `php.ini` kullanarak da yapılandırabilirsiniz. + +Docker imajında `php.ini` dosyası mevcut değildir, elle oluşturabilir veya resmi bir şablonu kopyalayabilirsiniz: + +```dockerfile +FROM dunglas/frankenphp + +# Developement: +RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini + +# Veya production: +RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini +``` + +## Caddyfile Konfigürasyonu + +FrankenPHP yürütücüsünü kaydetmek için `frankenphp` [global seçenek](https://caddyserver.com/docs/caddyfile/concepts#global-options) ayarlanmalıdır, ardından PHP uygulamanızı sunmak için site blokları içinde `php_server` veya `php` [HTTP yönergeleri](https://caddyserver.com/docs/caddyfile/concepts#directives) kullanılabilir. + +Minimal örnek: + +```caddyfile +{ + # FrankenPHP'yi aktif et + frankenphp + # Yönergenin ne zaman yürütülmesi gerektiğini yapılandırma + order php_server before file_server +} + +localhost { + # Sıkıştırmayı etkinleştir (isteğe bağlı) + encode zstd br gzip + # Geçerli dizindeki PHP dosyalarını çalıştırın ve varlıkları sunun + php_server +} +``` + +İsteğe bağlı olarak, oluşturulacak iş parçacığı sayısı ve sunucuyla birlikte başlatılacak [işçi betikleri] (worker.md) global seçenek altında belirtilebilir. + +```caddyfile +{ + frankenphp { + num_threads # Başlatılacak PHP iş parçacığı sayısını ayarlar. Varsayılan: Mevcut CPU çekirdek sayısının 2 katı. + worker { + file # Çalışan komut dosyasının yolunu ayarlar. + num # Başlatılacak PHP iş parçacığı sayısını ayarlar, varsayılan değer mevcut CPU çekirdek sayısının 2 katıdır. + env # Ek bir ortam değişkenini verilen değere ayarlar. Birden fazla ortam değişkeni için birden fazla kez belirtilebilir. + } + } +} + +# ... +``` + +Alternatif olarak, `worker` seçeneğinin tek satırlık kısa formunu kullanabilirsiniz: + +```caddyfile +{ + frankenphp { + worker + } +} + +# ... +``` + +Aynı sunucuda birden fazla uygulamaya hizmet veriyorsanız birden fazla işçi de tanımlayabilirsiniz: + +```caddyfile +{ + frankenphp { + worker /path/to/app/public/index.php + worker /path/to/other/public/index.php + } +} + +app.example.com { + root * /path/to/app/public + php_server +} + +other.example.com { + root * /path/to/other/public + php_server +} + +# ... +``` + +Genellikle ihtiyacınız olan şey `php_server` yönergesini kullanmaktır, +ancak tam kontrole ihtiyacınız varsa, daha düşük seviyeli `php` yönergesini kullanabilirsiniz: + +php_server` yönergesini kullanmak bu yapılandırmay ile aynıdır: + +```caddyfile +route { + # Dizin istekleri için sondaki eğik çizgiyi, diğer adıyla taksim işaretini ekleyin + @canonicalPath { + file {path}/index.php + not path */ + } + redir @canonicalPath {path}/ 308 + # İstenen dosya mevcut değilse, dizin dosyalarını deneyin + @indexFiles file { + try_files {path} {path}/index.php index.php + split_path .php + } + rewrite @indexFiles {http.matchers.file.relative} + # FrankenPHP! + @phpFiles path *.php + php @phpFiles + file_server +} +``` + +php_server` ve `php` yönergeleri aşağıdaki seçeneklere sahiptir: + +```caddyfile +php_server [] { + root # Sitenin kök klasörünü ayarlar. Öntanımlı: `root` yönergesi. + split_path # URI'yi iki parçaya bölmek için alt dizgeleri ayarlar. İlk eşleşen alt dizge "yol bilgisini" yoldan ayırmak için kullanılır. İlk parça eşleşen alt dizeyle sonlandırılır ve gerçek kaynak (CGI betiği) adı olarak kabul edilir. İkinci parça betiğin kullanması için PATH_INFO olarak ayarlanacaktır. Varsayılan: `.php` + resolve_root_symlink false # Varsa, sembolik bir bağlantıyı değerlendirerek `root` dizininin gerçek değerine çözümlenmesini devre dışı bırakır (varsayılan olarak etkindir). + env # Ek bir ortam değişkenini verilen değere ayarlar. Birden fazla ortam değişkeni için birden fazla kez belirtilebilir. +} +``` + +## Ortam Değişkenleri + +Aşağıdaki ortam değişkenleri `Caddyfile` içinde değişiklik yapmadan Caddy yönergelerini entegre etmek için kullanılabilir: + +* `SERVER_NAME`: değiştirin [dinlenecek adresleri](https://caddyserver.com/docs/caddyfile/concepts#addresses), sağlanan ana bilgisayar adları oluşturulan TLS sertifikası için de kullanılacaktır +* `CADDY_GLOBAL_OPTIONS`: entegre edin [global seçenekler](https://caddyserver.com/docs/caddyfile/options) +* `FRANKENPHP_CONFIG`: `frankenphp` yönergesi altına yapılandırma entegre edin + +FPM ve CLI SAPI'lerinde olduğu gibi, ortam değişkenleri varsayılan olarak `$_SERVER` süper globalinde gösterilir. + +[`variables_order`'a ait PHP yönergesinin](https://www.php.net/manual/en/ini.core.php#ini.variables-order) `S` değeri bu yönergede `E`'nin başka bir yere yerleştirilmesinden bağımsız olarak her zaman `ES` ile eş değerdir. + +## PHP konfigürasyonu + +Ek olarak [PHP yapılandırma dosyalarını](https://www.php.net/manual/en/configuration.file.php#configuration.file.scan) yüklemek için +`PHP_INI_SCAN_DIR` ortam değişkeni kullanılabilir. +Ayarlandığında, PHP verilen dizinlerde bulunan `.ini` uzantılı tüm dosyaları yükleyecektir. + +## Hata Ayıklama Modunu Etkinleştirin + +Docker imajını kullanırken, hata ayıklama modunu etkinleştirmek için `CADDY_GLOBAL_OPTIONS` ortam değişkenini `debug` olarak ayarlayın: + +```console +docker run -v $PWD:/app/public \ + -e CADDY_GLOBAL_OPTIONS=debug \ + -p 80:80 -p 443:443 -p 443:443/udp \ + dunglas/frankenphp +``` diff --git a/docs/tr/docker.md b/docs/tr/docker.md new file mode 100644 index 0000000000..0c52da8d4a --- /dev/null +++ b/docs/tr/docker.md @@ -0,0 +1,167 @@ +# Özel Docker İmajı Oluşturma + +[Resmi PHP imajları](https://hub.docker.com/_/php/) temel alınarak [FrankenPHP Docker imajları](https://hub.docker.com/r/dunglas/frankenphp) hazırlanmıştır. Popüler mimariler için Debian ve Alpine Linux varyantları sağlanmıştır. Debian dağıtımı tavsiye edilir. + +PHP 8.2 ve PHP 8.3 için varyantlar sağlanmıştır. [Etiketlere göz atın](https://hub.docker.com/r/dunglas/frankenphp/tags). + +## İmajlar Nasıl Kullanılır + +Projenizde bir `Dockerfile` oluşturun: + +```dockerfile +FROM dunglas/frankenphp + +COPY . /app/public +``` + +Ardından, Docker imajını oluşturmak ve çalıştırmak için bu komutları çalıştırın: + +```console +docker build -t my-php-app . +docker run -it --rm --name my-running-app my-php-app +``` + +## Daha Fazla PHP Eklentisi Nasıl Kurulur + +[Docker-php-extension-installer`](https://github.com/mlocati/docker-php-extension-installer) betiği temel imajda sağlanmıştır. +Ek PHP eklentileri eklemek ise gerçekten kolaydır: + +```dockerfile +FROM dunglas/frankenphp + +# buraya istenilen eklentileri ekleyin: +RUN install-php-extensions \ + pdo_mysql \ + gd \ + intl \ + zip \ + opcache +``` + +## Daha Fazla Caddy Modülü Nasıl Kurulur + +FrankenPHP, Caddy'nin üzerine inşa edilmiştir ve tüm [Caddy modülleri](https://caddyserver.com/docs/modules/) FrankenPHP ile kullanılabilir. + +Özel Caddy modüllerini kurmanın en kolay yolu [xcaddy](https://github.com/caddyserver/xcaddy) kullanmaktır: + +```dockerfile +FROM dunglas/frankenphp:latest-builder AS builder + +# xcaddy'yi derleyen imaja kopyalayın +COPY --from=caddy:builder /usr/bin/xcaddy /usr/bin/xcaddy + +# FrankenPHP oluşturmak için CGO etkinleştirilmelidir +ENV CGO_ENABLED=1 XCADDY_SETCAP=1 XCADDY_GO_BUILD_FLAGS="-ldflags '-w -s'" +RUN xcaddy build \ + --output /usr/local/bin/frankenphp \ + --with github.com/dunglas/frankenphp=./ \ + --with github.com/dunglas/frankenphp/caddy=./caddy/ \ + # Mercure ve Vulcain resmi yapıya dahil edilmiştir, ancak bunları kaldırmaktan çekinmeyin + --with github.com/dunglas/caddy-cbrotli \ + --with github.com/dunglas/mercure/caddy \ + --with github.com/dunglas/vulcain/caddy + # Buraya ekstra Caddy modülleri ekleyin + +FROM dunglas/frankenphp AS runner + +# Resmi binary dosyayı özel modüllerinizi içeren binary dosyayla değiştirin +COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp +``` + +FrankenPHP tarafından sağlanan `builder` imajı `libphp`'nin derlenmiş bir sürümünü içerir. +[Derleyici imajları](https://hub.docker.com/r/dunglas/frankenphp/tags?name=builder) hem Debian hem de Alpine için FrankenPHP ve PHP'nin tüm sürümleri için sağlanmıştır. + +> [!TIP] +> +> Eğer Alpine Linux ve Symfony kullanıyorsanız, +> [varsayılan yığın boyutunu artırmanız](compile.md#using-xcaddy) gerekebilir. + +## Varsayılan Olarak Worker Modunun Etkinleştirilmesi + +FrankenPHP'yi bir worker betiği ile başlatmak için `FRANKENPHP_CONFIG` ortam değişkenini ayarlayın: + +```dockerfile +FROM dunglas/frankenphp + +# ... + +ENV FRANKENPHP_CONFIG="worker ./public/index.php" +``` + +## Geliştirme Sürecinde Yığın (Volume) Kullanma + +FrankenPHP ile kolayca geliştirme yapmak için, uygulamanın kaynak kodunu içeren dizini ana bilgisayarınızdan Docker konteynerine bir yığın (volume) olarak bağlayın: + +```console +docker run -v $PWD:/app/public -p 80:80 -p 443:443 -p 443:443/udp --tty my-php-app +``` + +> ![İPUCU] +> +> `--tty' seçeneği JSON günlükleri yerine insan tarafından okunabilir güzel günlüklere sahip olmayı sağlar. + +Docker Compose ile: + +```yaml +# compose.yaml + +services: + php: + image: dunglas/frankenphp + # özel bir Dockerfile kullanmak istiyorsanız aşağıdaki yorum satırını kaldırın + #build: . + # bunu bir production ortamında çalıştırmak istiyorsanız aşağıdaki yorum satırını kaldırın + # restart: always + ports: + - "80:80" # HTTP + - "443:443" # HTTPS + - "443:443/udp" # HTTP/3 + volumes: + - ./:/app/public + - caddy_data:/data + - caddy_config:/config + # production ortamda aşağıdaki satırı yorum satırı yapın, geliştirme ortamında insan tarafından okunabilir güzel günlüklere sahip olmanızı sağlar + tty: true + +# Caddy sertifikaları ve yapılandırması için gereken yığınlar (volumes) +volumes: + caddy_data: + caddy_config: +``` + +## Root Olmayan Kullanıcı Olarak Çalıştırma + +FrankenPHP, Docker'da root olmayan kullanıcı olarak çalışabilir. + +İşte bunu yapan örnek bir `Dockerfile`: + +```dockerfile +FROM dunglas/frankenphp + +ARG USER=www-data + +RUN \ + # Alpine tabanlı dağıtımlar için "adduser -D ${USER}" kullanın + useradd -D ${USER}; \ + # 80 ve 443 numaralı bağlantı noktalarına bağlanmak için ek özellik ekleyin + setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/frankenphp; \ + # /data/caddy ve /config/caddy dosyalarına yazma erişimi verin + chown -R ${USER}:${USER} /data/caddy && chown -R ${USER}:${USER} /config/caddy; + +USER ${USER} +``` + +## Güncellemeler + +Docker imajları oluşturulur: + +* Yeni bir sürüm etiketlendiğinde +* Her gün UTC ile saat 4'te Resmi PHP imajlarının yeni sürümleri mevcutsa + +## Geliştirme Sürümleri + +Geliştirme sürümleri [`dunglas/frankenphp-dev`](https://hub.docker.com/repository/docker/dunglas/frankenphp-dev) Docker deposunda mevcuttur. +GitHub deposunun ana dalına her commit yapıldığında yeni bir derleme tetiklenir. + +`latest*` etiketleri `main` dalının başına işaret eder. +`sha-` biçimindeki etiketler de kullanılabilir. diff --git a/docs/tr/early-hints.md b/docs/tr/early-hints.md new file mode 100644 index 0000000000..1dad43212d --- /dev/null +++ b/docs/tr/early-hints.md @@ -0,0 +1,21 @@ +# Early Hints + +FrankenPHP [103 Early Hints durum kodunu](https://developer.chrome.com/blog/early-hints/) yerel olarak destekler. +Early Hints kullanmak web sayfalarınızın yüklenme süresini %30 oranında artırabilir. + +```php +; rel=preload; as=style'); +headers_send(103); + +// yavaş algoritmalarınız ve SQL sorgularınız 🤪 + +echo <<<'HTML' + +Hello FrankenPHP + +HTML; +``` + +Early Hints hem normal hem de [worker](worker.md) modları tarafından desteklenir. diff --git a/docs/tr/embed.md b/docs/tr/embed.md new file mode 100644 index 0000000000..df265c2688 --- /dev/null +++ b/docs/tr/embed.md @@ -0,0 +1,132 @@ +# Binary Dosyası Olarak PHP Uygulamaları + +FrankenPHP, PHP uygulamalarının kaynak kodunu ve varlıklarını statik, kendi kendine yeten bir binary dosyaya yerleştirme yeteneğine sahiptir. + +Bu özellik sayesinde PHP uygulamaları, uygulamanın kendisini, PHP yorumlayıcısını ve üretim düzeyinde bir web sunucusu olan Caddy'yi içeren bağımsız bir binary dosyalar olarak çıktısı alınabilir ve dağıtılabilir. + +Bu özellik hakkında daha fazla bilgi almak için [Kévin tarafından SymfonyCon 2023'te yapılan sunuma](https://dunglas.dev/2023/12/php-and-symfony-apps-as-standalone-binaries/) göz atabilirsiniz. + +## Preparing Your App + +Bağımsız binary dosyayı oluşturmadan önce uygulamanızın gömülmeye hazır olduğundan emin olun. + +Örneğin muhtemelen şunları yapmak istersiniz: + +* Uygulamanın üretim bağımlılıklarını yükleyin +* Otomatik yükleyiciyi boşaltın +* Uygulamanızın üretim modunu etkinleştirin (varsa) +* Nihai binary dosyanızın boyutunu küçültmek için `.git` veya testler gibi gerekli olmayan dosyaları çıkarın + +Örneğin, bir Symfony uygulaması için aşağıdaki komutları kullanabilirsiniz: + +```console +# .git/, vb. dosyalarından kurtulmak için projeyi dışa aktarın +mkdir $TMPDIR/my-prepared-app +git archive HEAD | tar -x -C $TMPDIR/my-prepared-app +cd $TMPDIR/my-prepared-app + +# Uygun ortam değişkenlerini ayarlayın +echo APP_ENV=prod > .env.local +echo APP_DEBUG=0 >> .env.local + +# Testleri kaldırın +rm -Rf tests/ + +# Bağımlılıkları yükleyin +composer install --ignore-platform-reqs --no-dev -a + +# .env'yi optimize edin +composer dump-env prod +``` + +## Linux Binary'si Oluşturma + +Bir Linux binary çıktısı almanın en kolay yolu, sağladığımız Docker tabanlı derleyiciyi kullanmaktır. + +1. Hazırladığınız uygulamanın deposunda `static-build.Dockerfile` adlı bir dosya oluşturun: + + ```dockerfile + FROM --platform=linux/amd64 dunglas/frankenphp:static-builder + + # Uygulamanızı kopyalayın + WORKDIR /go/src/app/dist/app + COPY . . + + # Statik binary dosyasını oluşturun, yalnızca istediğiniz PHP eklentilerini seçtiğinizden emin olun + WORKDIR /go/src/app/ + RUN EMBED=dist/app/ \ + PHP_EXTENSIONS=ctype,iconv,pdo_sqlite \ + ./build-static.sh + ``` + + > [!CAUTION] + > + > Bazı `.dockerignore` dosyaları (örneğin varsayılan [Symfony Docker `.dockerignore`](https://github.com/dunglas/symfony-docker/blob/main/.dockerignore)) + > `vendor/` dizinini ve `.env` dosyalarını yok sayacaktır. Derlemeden önce `.dockerignore` dosyasını ayarladığınızdan veya kaldırdığınızdan emin olun. + +2. Derleyin: + + ```console + docker build -t static-app -f static-build.Dockerfile . + ``` + +3. Binary dosyasını çıkarın: + + ```console + docker cp $(docker create --name static-app-tmp static-app):/go/src/app/dist/frankenphp-linux-x86_64 my-app ; docker rm static-app-tmp + ``` + +Elde edilen binary dosyası, geçerli dizindeki `my-app` adlı dosyadır. + +## Diğer İşletim Sistemleri için Binary Çıktısı Alma + +Docker kullanmak istemiyorsanız veya bir macOS binary dosyası oluşturmak istiyorsanız, sağladığımız kabuk betiğini kullanın: + +```console +git clone https://github.com/dunglas/frankenphp +cd frankenphp +EMBED=/path/to/your/app \ + PHP_EXTENSIONS=ctype,iconv,pdo_sqlite \ + ./build-static.sh +``` + +Elde edilen binary dosyası `dist/` dizinindeki `frankenphp--` adlı dosyadır. + +## Binary Dosyasını Kullanma + +İşte bu kadar! `my-app` dosyası (veya diğer işletim sistemlerinde `dist/frankenphp--`) bağımsız uygulamanızı içerir! + +Web uygulamasını başlatmak için çalıştırın: + +```console +./my-app php-server +``` + +Uygulamanız bir [worker betiği](worker.md) içeriyorsa, worker'ı aşağıdaki gibi bir şeyle başlatın: + +```console +./my-app php-server --worker public/index.php +``` + +HTTPS (Let's Encrypt sertifikası otomatik olarak oluşturulur), HTTP/2 ve HTTP/3'ü etkinleştirmek için kullanılacak alan adını belirtin: + +```console +./my-app php-server --domain localhost +``` + +Ayrıca binary dosyanıza gömülü PHP CLI betiklerini de çalıştırabilirsiniz: + +```console +./my-app php-cli bin/console +``` + +## Yapıyı Özelleştirme + +Binary dosyasının nasıl özelleştirileceğini (uzantılar, PHP sürümü...) görmek için [Statik derleme dokümanını okuyun](static.md). + +## Binary Dosyasının Dağıtılması + +Linux'ta, oluşturulan ikili dosya [UPX](https://upx.github.io) kullanılarak sıkıştırılır. + +Mac'te, göndermeden önce dosyanın boyutunu küçültmek için sıkıştırabilirsiniz. +Biz `xz` öneririz. diff --git a/docs/tr/github-actions.md b/docs/tr/github-actions.md new file mode 100644 index 0000000000..8b25ca7999 --- /dev/null +++ b/docs/tr/github-actions.md @@ -0,0 +1,31 @@ +# GitHub Actions Kullanma + +Bu depo Docker imajını [Docker Hub](https://hub.docker.com/r/dunglas/frankenphp) üzerinde derler ve dağıtır. +Bu durum onaylanan her çekme (pull) isteğinde veya çatallandıktan (fork) sonra gerçekleşir. + +## GitHub Eylemlerini Ayarlama + +Depo ayarlarında, gizli değerler altında aşağıdaki gizli değerleri ekleyin: + +- `REGISTRY_LOGIN_SERVER`: Kullanılacak Docker Registry bilgisi (örneğin `docker.io`). +- `REGISTRY_USERNAME`: Giriş yapmak için kullanılacak kullanıcı adı (örn. `dunglas`). +- `REGISTRY_PASSWORD`: Oturum açmak için kullanılacak parola (örn. bir erişim anahtarı). +- `IMAGE_NAME`: İmajın adı (örn. `dunglas/frankenphp`). + +## İmajı Oluşturma ve Dağıtma + +1. Bir Çekme (pull) İsteği oluşturun veya çatala (forka) dağıtın. +2. GitHub Actions imajı oluşturacak ve tüm testleri çalıştıracaktır. +3. Derleme başarılı olursa, görüntü `pr-x` (burada `x` PR numarasıdır) etiketi kullanılarak ilgili saklanan yere (registry'e) gönderilir. + +## İmajı Dağıtma + +1. Çekme (pull) isteği birleştirildikten sonra, GitHub Actions testleri tekrar çalıştıracak ve yeni bir imaj oluşturacaktır. +2. Derleme başarılı olursa, `main` etiketi Docker Registry'de güncellenecektir. + +## Bültenler + +1. Depoda yeni bir etiket oluşturun. +2. GitHub Actions imajı oluşturacak ve tüm testleri çalıştıracaktır. +3. Derleme başarılı olursa, etiket adı etiket olarak kullanılarak imaj saklanan yere (registry'e) gönderilir (örneğin `v1.2.3` ve `v1.2` oluşturulur). +4. `latest` etiketi de güncellenecektir. diff --git a/docs/tr/known-issues.md b/docs/tr/known-issues.md new file mode 100644 index 0000000000..ef80801c76 --- /dev/null +++ b/docs/tr/known-issues.md @@ -0,0 +1,139 @@ +# Bilinen Sorunlar + +## Fibers + +[Fibers](https://www.php.net/manual/en/language.fibers.php) içinde [cgo](https://go.dev/blog/cgo) çağrısı yapan PHP fonksiyonlarının ve dil yapılarının çağrılmasının çökmelere neden olduğu bilinmektedir. + +Bu sorun [Go projesi tarafından üzerinde çalışılmaktadır](https://github.com/golang/go/issues/62130). + +Bu arada, bir çözüm Fibers içinden Go'ya temsilci atayan yapıları (`echo` gibi) ve fonksiyonları (`header()` gibi) kullanmamaktır. + +Bu kod, Fiber içinde `echo` kullandığı için büyük olasılıkla çökecektir: + +```php +$fiber = new Fiber(function() { + echo 'In the Fiber'.PHP_EOL; + echo 'Still inside'.PHP_EOL; +}); +$fiber->start(); +``` + +Bunun yerine, değeri Fiber'den döndürün ve dışarıda kullanın: + +```php +$fiber = new Fiber(function() { + Fiber::suspend('In the Fiber'.PHP_EOL)); + Fiber::suspend('Still inside'.PHP_EOL)); +}); +echo $fiber->start(); +echo $fiber->resume(); +$fiber->resume(); +``` + +## Desteklenmeyen PHP Eklentileri + +Aşağıdaki eklentilerin FrankenPHP ile uyumlu olmadığı bilinmektedir: + +| Adı | Nedeni | Alternatifleri | +|-------------------------------------------------------------|----------------------------|----------------------------------------------------------------------------------------------------------------------| +| [imap](https://www.php.net/manual/en/imap.installation.php) | İş parçacığı güvenli değil | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | + +## Sorunlu PHP Eklentileri + +Aşağıdaki eklentiler FrankenPHP ile kullanıldığında bilinen hatalara ve beklenmeyen davranışlara sahiptir: + +| Adı | Problem | +|-----------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [XDebug](https://xdebug.org/) | XDebug çökebilir veya askıda kalabilir. Bu sorun [XDebug tarafından takip ediliyor](https://github.com/dunglas/frankenphp/issues/563#issuecomment-1952226212). | +| [Tideways](https://tideways.com/) | Worker modunda, Tideways eklentisi [worker komut dosyalarının düzgün şekilde sonlandırılmasını engelliyor](https://github.com/dunglas/frankenphp/issues/578#issuecomment-1966620351) veya CPU'nun %100'ünü tüketiyor. Bu durum Tideways'e bildirilmiştir. | + +## get_browser + +[get_browser()](https://www.php.net/manual/en/function.get-browser.php) fonksiyonu bir süre sonra kötü performans gösteriyor gibi görünüyor. Geçici bir çözüm, statik oldukları için User-Agent başına sonuçları önbelleğe almaktır (örneğin [APCu](https://www.php.net/manual/en/book.apcu.php) ile). + +## Binary Çıktısı ve Alpine Tabanlı Docker İmajları + +Binary çıktısı ve Alpine tabanlı Docker imajları (dunglas/frankenphp:*-alpine), daha küçük bir binary boyutu korumak için glibc ve arkadaşları yerine musl libc kullanır. Bu durum bazı uyumluluk sorunlarına yol açabilir. Özellikle, glob seçeneği GLOB_BRACE mevcut değildir. + +## Docker ile `https://127.0.0.1` Kullanımı + +FrankenPHP varsayılan olarak `localhost` için bir TLS sertifikası oluşturur. +Bu, yerel geliştirme için en kolay ve önerilen seçenektir. + +Bunun yerine ana bilgisayar olarak `127.0.0.1` kullanmak istiyorsanız, sunucu adını `127.0.0.1` şeklinde ayarlayarak bunun için bir sertifika oluşturacak yapılandırma yapmak mümkündür. + +Ne yazık ki, [ağ sistemi](https://docs.docker.com/network/) nedeniyle Docker kullanırken bu yeterli değildir. +`Curl: (35) LibreSSL/3.3.6: error:1404B438:SSL routines:ST_CONNECT:tlsv1 alert internal error`'a benzer bir TLS hatası alırsınız. + +Linux kullanıyorsanız, [ana bilgisayar ağ sürücüsünü](https://docs.docker.com/network/network-tutorial-host/) kullanmak bir çözümdür: + +```console +docker run \ + -e SERVER_NAME="127.0.0.1" \ + -v $PWD:/app/public \ + --network host \ + dunglas/frankenphp +``` + +Ana bilgisayar ağ sürücüsü Mac ve Windows'ta desteklenmez. Bu platformlarda, konteynerin IP adresini tahmin etmeniz ve bunu sunucu adlarına dahil etmeniz gerekecektir. + +`docker network inspect bridge`'i çalıştırın ve `IPv4Address` anahtarının altındaki son atanmış IP adresini belirlemek için `Containers` anahtarına bakın ve bir artırın. Eğer hiçbir konteyner çalışmıyorsa, ilk atanan IP adresi genellikle `172.17.0.2`dir. + +Ardından, bunu `SERVER_NAME` ortam değişkenine ekleyin: + +```console +docker run \ + -e SERVER_NAME="127.0.0.1, 172.17.0.3" \ + -v $PWD:/app/public \ + -p 80:80 -p 443:443 -p 443:443/udp \ + dunglas/frankenphp +``` + +> [!CAUTION] +> +> 172.17.0.3`ü konteynerinize atanacak IP ile değiştirdiğinizden emin olun. + +Artık ana makineden `https://127.0.0.1` adresine erişebilmeniz gerekir. + +Eğer durum böyle değilse, sorunu anlamaya çalışmak için FrankenPHP'yi hata ayıklama modunda başlatın: + +```console +docker run \ + -e CADDY_GLOBAL_OPTIONS="debug" + -e SERVER_NAME="127.0.0.1" \ + -v $PWD:/app/public \ + -p 80:80 -p 443:443 -p 443:443/udp \ + dunglas/frankenphp +``` + +## `@php` Referanslı Composer Betikler + +[Composer betikleri](https://getcomposer.org/doc/articles/scripts.md) bazı görevler için bir PHP binary çalıştırmak isteyebilir, örneğin [bir Laravel projesinde](laravel.md) `@php artisan package:discover --ansi` çalıştırmak. Bu [şu anda mümkün değil](https://github.com/dunglas/frankenphp/issues/483#issuecomment-1899890915) ve 2 nedeni var: + +* Composer FrankenPHP binary dosyasını nasıl çağıracağını bilmiyor; +* Composer, FrankenPHP'nin henüz desteklemediği `-d` bayrağını kullanarak PHP ayarlarını komuta ekleyebilir. + +Geçici bir çözüm olarak, `/usr/local/bin/php` içinde desteklenmeyen parametreleri silen ve ardından FrankenPHP'yi çağıran bir kabuk betiği oluşturabiliriz: + +```bash +#!/bin/bash +args=("$@") +index=0 +for i in "$@" +do + if [ "$i" == "-d" ]; then + unset 'args[$index]' + unset 'args[$index+1]' + fi + index=$((index+1)) +done + +/usr/local/bin/frankenphp php-cli ${args[@]} +``` + +Ardından `PHP_BINARY` ortam değişkenini PHP betiğimizin yoluna ayarlayın ve Composer bu yolla çalışacaktır: + +```bash +export PHP_BINARY=/usr/local/bin/php +composer install +``` diff --git a/docs/tr/laravel.md b/docs/tr/laravel.md new file mode 100644 index 0000000000..28c58b78fe --- /dev/null +++ b/docs/tr/laravel.md @@ -0,0 +1,75 @@ +# Laravel + +## Docker + +Bir [Laravel](https://laravel.com) web uygulamasını FrankenPHP ile çalıştırmak, projeyi resmi Docker imajının `/app` dizinine monte etmek kadar kolaydır. + +Bu komutu Laravel uygulamanızın ana dizininden çalıştırın: + +```console +docker run -p 80:80 -p 443:443 -p 443:443/udp -v $PWD:/app dunglas/frankenphp +``` + +And tadını çıkarın! + +## Yerel Kurulum + +Alternatif olarak, Laravel projelerinizi FrankenPHP ile yerel makinenizden çalıştırabilirsiniz: + +1. [Sisteminize karşılık gelen binary dosyayı indirin](https://github.com/dunglas/frankenphp/releases) +2. Aşağıdaki yapılandırmayı Laravel projenizin kök dizinindeki `Caddyfile` adlı bir dosyaya ekleyin: + + ```caddyfile + { + frankenphp + order php_server before file_server + } + + # Sunucunuzun alan adı + localhost { + # Webroot'u public/ dizinine ayarlayın + root * public/ + # Sıkıştırmayı etkinleştir (isteğe bağlı) + encode zstd br gzip + # PHP dosyalarını public/ dizininden çalıştırın ve varlıkları sunun + php_server + } + ``` + +3. FrankenPHP'yi Laravel projenizin kök dizininden başlatın: `./frankenphp run` + +## Laravel Octane + +Octane, Composer paket yöneticisi aracılığıyla kurulabilir: + +```console +composer require laravel/octane +``` + +Octane'ı kurduktan sonra, Octane'ın yapılandırma dosyasını uygulamanıza yükleyecek olan `octane:install` Artisan komutunu çalıştırabilirsiniz: + +```console +php artisan octane:install --server=frankenphp +``` + +Octane sunucusu `octane:start` Artisan komutu aracılığıyla başlatılabilir. + +```console +php artisan octane:start +``` + +`octane:start` komutu aşağıdaki seçenekleri alabilir: + +* `--host`: Sunucunun bağlanması gereken IP adresi (varsayılan: `127.0.0.1`) +* `--port`: Sunucunun erişilebilir olması gereken port (varsayılan: `8000`) +* `--admin-port`: Yönetici sunucusunun erişilebilir olması gereken port (varsayılan: `2019`) +* `--workers`: İstekleri işlemek için hazır olması gereken worker sayısı (varsayılan: `auto`) +* `--max-requests`: Sunucu yeniden yüklenmeden önce işlenecek istek sayısı (varsayılan: `500`) +* `--caddyfile`: FrankenPHP `Caddyfile` dosyasının yolu +* `--https`: HTTPS, HTTP/2 ve HTTP/3'ü etkinleştirin ve sertifikaları otomatik olarak oluşturup yenileyin +* `--http-redirect`: HTTP'den HTTPS'ye yeniden yönlendirmeyi etkinleştir (yalnızca --https geçilirse etkinleştirilir) +* `--watch`: Uygulamada kod değişikliği olduğunda sunucuyu otomatik olarak yeniden yükle +* `--poll`: Dosyaları bir ağ üzerinden izlemek için izleme sırasında dosya sistemi yoklamasını kullanın +* `--log-level`: Belirtilen günlük seviyesinde veya üzerinde günlük mesajları + +Laravel Octane hakkında daha fazla bilgi edinmek için [Laravel Octane resmi belgelerine](https://laravel.com/docs/octane) göz atın. diff --git a/docs/tr/mercure.md b/docs/tr/mercure.md new file mode 100644 index 0000000000..e01ddce80d --- /dev/null +++ b/docs/tr/mercure.md @@ -0,0 +1,12 @@ +# Gerçek Zamanlı + +FrankenPHP yerleşik bir [Mercure](https://mercure.rocks) hub ile birlikte gelir! +Mercure, olayları tüm bağlı cihazlara gerçek zamanlı olarak göndermeye olanak tanır: anında bir JavaScript olayı alırlar. + +JS kütüphanesi veya SDK gerekmez! + +![Mercure](https://mercure.rocks/static/main.png) + +Mercure hub'ını etkinleştirmek için [Mercure'ün sitesinde](https://mercure.rocks/docs/hub/config) açıklandığı gibi `Caddyfile`'ı güncelleyin. + +Mercure güncellemelerini kodunuzdan göndermek için [Symfony Mercure Bileşenini](https://symfony.com/components/Mercure) öneririz (kullanmak için Symfony tam yığın çerçevesine ihtiyacınız yoktur). diff --git a/docs/tr/production.md b/docs/tr/production.md new file mode 100644 index 0000000000..64821a5784 --- /dev/null +++ b/docs/tr/production.md @@ -0,0 +1,139 @@ +# Production Ortamına Dağıtım + +Bu dokümanda, Docker Compose kullanarak bir PHP uygulamasını tek bir sunucuya nasıl dağıtacağımızı öğreneceğiz. + +Symfony kullanıyorsanız, Symfony Docker projesinin (FrankenPHP kullanan) "[Production ortamına dağıtım](https://github.com/dunglas/symfony-docker/blob/main/docs/production.md)" dokümanını okumayı tercih edebilirsiniz. + +API Platform (FrankenPHP de kullanır) tercih ediyorsanız, [çerçevenin dağıtım dokümanına](https://api-platform.com/docs/deployment/) bakabilirsiniz. + +## Uygulamanızı Hazırlama + +İlk olarak, PHP projenizin kök dizininde bir `Dockerfile` oluşturun: + +```dockerfile +FROM dunglas/frankenphp + +# "your-domain-name.example.com" yerine kendi alan adınızı yazdığınızdan emin olun +ENV SERVER_NAME=your-domain-name.example.com +# HTTPS'yi devre dışı bırakmak istiyorsanız, bunun yerine bu değeri kullanın: +#ENV SERVER_NAME=:80 + +# PHP production ayarlarını etkinleştirin +RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" + +# Projenizin PHP dosyalarını genel dizine kopyalayın +COPY . /app/public +# Symfony veya Laravel kullanıyorsanız, bunun yerine tüm projeyi kopyalamanız gerekir: +#COPY . /app +``` + +Daha fazla ayrıntı ve seçenek için "[Özel Docker İmajı Oluşturma](docker.md)" bölümüne bakın, +ve yapılandırmayı nasıl özelleştireceğinizi öğrenmek için PHP eklentilerini ve Caddy modüllerini yükleyin. + +Projeniz Composer kullanıyorsa, +Docker imajına dahil ettiğinizden ve bağımlılıklarınızı yüklediğinizden emin olun. + +Ardından, bir `compose.yaml` dosyası ekleyin: + +```yaml +services: + php: + image: dunglas/frankenphp + restart: always + ports: + - "80:80" # HTTP + - "443:443" # HTTPS + - "443:443/udp" # HTTP/3 + volumes: + - caddy_data:/data + - caddy_config:/config + +# Caddy sertifikaları ve yapılandırması için gereken yığınlar (volumes) +volumes: + caddy_data: + caddy_config: +``` + +> [!NOTE] +> +> Önceki örnekler production kullanımı için tasarlanmıştır. +> Geliştirme aşamasında, bir yığın (volume), farklı bir PHP yapılandırması ve `SERVER_NAME` ortam değişkeni için farklı bir değer kullanmak isteyebilirsiniz. +> +> (FrankenPHP kullanan) çok aşamalı Composer, ekstra PHP eklentileri vb. içeren imajlara başvuran daha gelişmiş bir örnek için [Symfony Docker](https://github.com/dunglas/symfony-docker) projesine bir göz atın. + +Son olarak, eğer Git kullanıyorsanız, bu dosyaları commit edin ve push edin. + +## Sunucu Hazırlama + +Uygulamanızı production ortamına dağıtmak için bir sunucuya ihtiyacınız vardır. +Bu dokümanda, DigitalOcean tarafından sağlanan bir sanal makine kullanacağız, ancak herhangi bir Linux sunucusu çalışabilir. +Docker yüklü bir Linux sunucunuz varsa, doğrudan [bir sonraki bölüme](#alan-adı-yapılandırma) geçebilirsiniz. + +Aksi takdirde, 200 $ ücretsiz kredi almak için [bu ortaklık bağlantısını](https://m.do.co/c/5d8aabe3ab80) kullanın, bir hesap oluşturun ve ardından "Create a Droplet" seçeneğine tıklayın. +Ardından, "Bir imaj seçin" bölümünün altındaki "Marketplace" sekmesine tıklayın ve "Docker" adlı uygulamayı bulun. +Bu, Docker ve Docker Compose'un en son sürümlerinin zaten yüklü olduğu bir Ubuntu sunucusu sağlayacaktır! + +Test amaçlı kullanım için en ucuz planlar yeterli olacaktır. +Gerçek production kullanımı için, muhtemelen ihtiyaçlarınıza uyacak şekilde "genel amaçlı" bölümünden bir plan seçmek isteyeceksiniz. + +![Docker ile DigitalOcean FrankenPHP](digitalocean-droplet.png) + +Diğer ayarlar için varsayılanları koruyabilir veya ihtiyaçlarınıza göre değiştirebilirsiniz. +SSH anahtarınızı eklemeyi veya bir parola oluşturmayı unutmayın, ardından "Sonlandır ve oluştur" düğmesine basın. + +Ardından, Droplet'iniz hazırlanırken birkaç saniye bekleyin. +Droplet'iniz hazır olduğunda, bağlanmak için SSH kullanın: + +```console +ssh root@ +``` + +## Alan Adı Yapılandırma + +Çoğu durumda sitenizle bir alan adını ilişkilendirmek isteyeceksiniz. +Henüz bir alan adınız yoksa, bir kayıt şirketi aracılığıyla bir alan adı satın almanız gerekir. + +Daha sonra alan adınız için sunucunuzun IP adresini işaret eden `A` türünde bir DNS kaydı oluşturun: + +```dns +your-domain-name.example.com. IN A 207.154.233.113 +``` + +DigitalOcean Alan Adları hizmetiyle ilgili örnek ("Networking" > "Domains"): + +![DigitalOcean'da DNS Yapılandırma](digitalocean-dns.png) + +> [!NOTE] +> +> FrankenPHP tarafından varsayılan olarak otomatik olarak TLS sertifikası oluşturmak için kullanılan hizmet olan Let's Encrypt, direkt IP adreslerinin kullanılmasını desteklemez. Let's Encrypt'i kullanmak için alan adı kullanmak zorunludur. + +## Dağıtım + +Projenizi `git clone`, `scp` veya ihtiyacınıza uygun başka bir araç kullanarak sunucuya kopyalayın. +GitHub kullanıyorsanız [bir dağıtım anahtarı](https://docs.github.com/en/free-pro-team@latest/developers/overview/managing-deploy-keys#deploy-keys) kullanmak isteyebilirsiniz. +Dağıtım anahtarları ayrıca [GitLab tarafından desteklenir](https://docs.gitlab.com/ee/user/project/deploy_keys/). + +Git ile örnek: + +```console +git clone git@github.com:/.git +``` + +Projenizi içeren dizine gidin (``) ve uygulamayı production modunda başlatın: + +```console +docker compose up -d --wait +``` + +Sunucunuz hazır ve çalışıyor. Sizin için otomatik olarak bir HTTPS sertifikası oluşturuldu. +`https://your-domain-name.example.com` adresine gidin ve keyfini çıkarın! + +> [!CAUTION] +> +> Docker bir önbellek katmanına sahip olabilir, her dağıtım için doğru derlemeye sahip olduğunuzdan emin olun veya önbellek sorununu önlemek için projenizi `--no-cache` seçeneği ile yeniden oluşturun. + +## Birden Fazla Düğümde Dağıtım + +Uygulamanızı bir makine kümesine dağıtmak istiyorsanız, [Docker Swarm](https://docs.docker.com/engine/swarm/stack-deploy/) kullanabilirsiniz, +sağlanan Compose dosyaları ile uyumludur. +Kubernetes üzerinde dağıtım yapmak için FrankenPHP kullanan [API Platformu ile sağlanan Helm grafiğine](https://api-platform.com/docs/deployment/kubernetes/) göz atın. diff --git a/docs/tr/static.md b/docs/tr/static.md new file mode 100644 index 0000000000..17a49ff073 --- /dev/null +++ b/docs/tr/static.md @@ -0,0 +1,81 @@ +# Statik Yapı Oluşturun + +PHP kütüphanesinin yerel kurulumunu kullanmak yerine, +harika [static-php-cli projesi](https://github.com/crazywhalecc/static-php-cli) sayesinde FrankenPHP'nin statik bir yapısını oluşturmak mümkündür (adına rağmen, bu proje sadece CLI'yi değil, tüm SAPI'leri destekler). + +Bu yöntemle, tek, taşınabilir bir ikili PHP yorumlayıcısını, Caddy web sunucusunu ve FrankenPHP'yi içerecektir! + +FrankenPHP ayrıca [PHP uygulamasının statik binary gömülmesini](embed.md) destekler. + +## Linux + +Linux statik binary dosyası oluşturmak için bir Docker imajı sağlıyoruz: + +```console +docker buildx bake --load static-builder +docker cp $(docker create --name static-builder dunglas/frankenphp:static-builder):/go/src/app/dist/frankenphp-linux-$(uname -m) frankenphp ; docker rm static-builder +``` + +Elde edilen statik binary `frankenphp` olarak adlandırılır ve geçerli dizinde kullanılabilir. + +Statik binary dosyasını Docker olmadan oluşturmak istiyorsanız, Linux için de çalışan macOS talimatlarına bir göz atın. + +### Özel Eklentiler + +Varsayılan olarak, en popüler PHP eklentileri zaten derlenir. + +Binary dosyanın boyutunu küçültmek ve saldırı yüzeyini azaltmak için `PHP_EXTENSIONS` Docker ARG'sini kullanarak derlenecek eklentilerin listesini seçebilirsiniz. + +Örneğin, yalnızca `opcache` eklentisini derlemek için aşağıdaki komutu çalıştırın: + +```console +docker buildx bake --load --set static-builder.args.PHP_EXTENSIONS=opcache,pdo_sqlite static-builder +# ... +``` + +Etkinleştirdiğiniz eklentilere ek işlevler sağlayan kütüphaneler eklemek için `PHP_EXTENSION_LIBS` Docker ARG'sini kullanabilirsiniz: + +```console +docker buildx bake \ + --load \ + --set static-builder.args.PHP_EXTENSIONS=gd \ + --set static-builder.args.PHP_EXTENSION_LIBS=libjpeg,libwebp \ + static-builder +``` + +Derlemeyi nasıl [özelleştireceğinize](#yapıyı-özelleştirme) de bakın. + +### GitHub Token + +GitHub API kullanım limitine ulaşırsanız, `GITHUB_TOKEN` adlı bir ortam değişkeninde bir GitHub Personal Access Token ayarlayın: + +```console +GITHUB_TOKEN="xxx" docker --load buildx bake static-builder +# ... +``` + +## macOS + +macOS için statik bir binary oluşturmak için aşağıdaki betiği çalıştırın ([Homebrew](https://brew.sh/) yüklü olmalıdır): + +```console +git clone https://github.com/dunglas/frankenphp +cd frankenphp +./build-static.sh +``` + +Not: Bu betik Linux'ta (ve muhtemelen diğer Unix'lerde) da çalışır ve sağladığımız Docker tabanlı statik derleyici tarafından dahili olarak kullanılır. + +## Yapıyı Özelleştirme + +Aşağıdaki ortam değişkenleri `docker build` ve `build-static.sh` dosyalarına aktarılabilir +statik derlemeyi özelleştirmek için betik: + +* `FRANKENPHP_VERSION`: kullanılacak FrankenPHP sürümü +* `PHP_VERSION`: kullanılacak PHP sürümü +* `PHP_EXTENSIONS`: oluşturulacak PHP eklentileri ([desteklenen eklentiler listesi](https://static-php.dev/en/guide/extensions.html)) +* `PHP_EXTENSION_LIBS`: eklentilere özellikler ekleyen oluşturulacak ekstra kütüphaneler +* `EMBED`: binary dosyaya gömülecek PHP uygulamasının yolu +* `CLEAN`: ayarlandığında, libphp ve tüm bağımlılıkları sıfırdan oluşturulur (önbellek yok) +* `DEBUG_SYMBOLS`: ayarlandığında, hata ayıklama sembolleri ayıklanmayacak ve binary dosyaya eklenecektir +* `RELEASE`: (yalnızca bakımcılar) ayarlandığında, ortaya çıkan binary dosya GitHub'a yüklenecektir diff --git a/docs/tr/worker.md b/docs/tr/worker.md new file mode 100644 index 0000000000..977b9dd5cb --- /dev/null +++ b/docs/tr/worker.md @@ -0,0 +1,121 @@ +# FrankenPHP Worker'ları Kullanma + +Uygulamanızı bir kez önyükleyin ve bellekte tutun. +FrankenPHP gelen istekleri birkaç milisaniye içinde halledecektir. + +## Çalışan Komut Dosyalarının Başlatılması + +### Docker + +`FRANKENPHP_CONFIG` ortam değişkeninin değerini `worker /path/to/your/worker/script.php` olarak ayarlayın: + +```console +docker run \ + -e FRANKENPHP_CONFIG="worker /app/path/to/your/worker/script.php" \ + -v $PWD:/app \ + -p 80:80 -p 443:443 -p 443:443/udp \ + dunglas/frankenphp +``` + +### Binary Çıktısı + +Geçerli dizinin içeriğini bir worker kullanarak sunmak için `php-server` komutunun `--worker` seçeneğini kullanın: + +```console +./frankenphp php-server --worker /path/to/your/worker/script.php +``` + +PHP uygulamanız [binary dosyaya gömülü](embed.md) ise, uygulamanın kök dizinine özel bir `Caddyfile` ekleyebilirsiniz. +Otomatik olarak kullanılacaktır. + +## Symfony Çalışma Zamanı + +FrankenPHP'nin worker modu [Symfony Runtime Component](https://symfony.com/doc/current/components/runtime.html) tarafından desteklenmektedir. +Herhangi bir Symfony uygulamasını bir worker'da başlatmak için [PHP Runtime](https://github.com/php-runtime/runtime)'ın FrankenPHP paketini yükleyin: + +```console +composer require runtime/frankenphp-symfony +``` + +FrankenPHP Symfony Runtime'ı kullanmak için `APP_RUNTIME` ortam değişkenini tanımlayarak uygulama sunucunuzu başlatın: + +```console +docker run \ + -e FRANKENPHP_CONFIG="worker ./public/index.php" \ + -e APP_RUNTIME=Runtime\\FrankenPhpSymfony\\Runtime \ + -v $PWD:/app \ + -p 80:80 -p 443:443 -p 443:443/udp \ + dunglas/frankenphp +``` + +## Laravel Octane + +Bkz. [ilgili doküman](laravel.md#laravel-octane). + +## Özel Uygulamalar + +Aşağıdaki örnek, üçüncü taraf bir kütüphaneye güvenmeden kendi çalışan kodunuzu nasıl oluşturacağınızı göstermektedir: + +```php +boot(); + +// Daha iyi performans için döngü dışında işleyici (daha az iş yapıyor) +$handler = static function () use ($myApp) { + // Bir istek alındığında çağrılır, + // superglobals, php://input ve benzerleri sıfırlanır + echo $myApp->handle($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER); +}; + +for($nbRequests = 0, $running = true; isset($_SERVER['MAX_REQUESTS']) && ($nbRequests < ((int)$_SERVER['MAX_REQUESTS'])) && $running; ++$nbRequests) { + $running = \frankenphp_handle_request($handler); + + // HTTP yanıtını gönderdikten sonra bir şey yapın + $myApp->terminate(); + + // Bir sayfa oluşturmanın ortasında tetiklenme olasılığını azaltmak için çöp toplayıcıyı çağırın + gc_collect_cycles(); +} + +// Temizleme +$myApp->shutdown(); +``` + +Ardından, uygulamanızı başlatın ve çalışanınızı yapılandırmak için `FRANKENPHP_CONFIG` ortam değişkenini kullanın: + +```console +docker run \ + -e FRANKENPHP_CONFIG="worker ./public/index.php" \ + -v $PWD:/app \ + -p 80:80 -p 443:443 -p 443:443/udp \ + dunglas/frankenphp +``` + +Varsayılan olarak, CPU başına 2 worker başlatılır. +Başlatılacak worker sayısını da yapılandırabilirsiniz: + +```console +docker run \ + -e FRANKENPHP_CONFIG="worker ./public/index.php 42" \ + -v $PWD:/app \ + -p 80:80 -p 443:443 -p 443:443/udp \ + dunglas/frankenphp +``` + +### Belirli Sayıda İstekten Sonra Worker'ı Yeniden Başlatın + + +PHP başlangıçta uzun süreli işlemler için tasarlanmadığından, hala bellek sızdıran birçok kütüphane ve eski kod vardır. + +Bu tür kodları worker modunda kullanmak için geçici bir çözüm, belirli sayıda isteği işledikten sonra worker betiğini yeniden başlatmaktır: + +Önceki worker kod parçacığı, `MAX_REQUESTS` adlı bir ortam değişkeni ayarlayarak işlenecek maksimum istek sayısını yapılandırmaya izin verir.