Browse Source

docs: add FR translations and various EN improvements (#589)

* feat: add fr doc (#1)

* fix: fr translations

* fix: linter

* docs: various improvements

* fix: md links on readme fr

* fix: remove duplicate images

---------

Co-authored-by: Kévin Dunglas <kevin@dunglas.fr>
Laury S 1 year ago
parent
commit
963b3e0f59
10 changed files with 716 additions and 14 deletions
  1. 1 1
      README.md
  2. 6 5
      docs/config.md
  3. 6 4
      docs/docker.md
  4. 4 4
      docs/embed.md
  5. 177 0
      docs/fr/CONTRIBUTING.md
  6. 77 0
      docs/fr/README.md
  7. 101 0
      docs/fr/compile.md
  8. 158 0
      docs/fr/config.md
  9. 165 0
      docs/fr/docker.md
  10. 21 0
      docs/fr/early-hints.md

+ 1 - 1
README.md

@@ -6,7 +6,7 @@ FrankenPHP is a modern application server for PHP built on top of the [Caddy](ht
 
 FrankenPHP gives superpowers to your PHP apps thanks to its stunning features: [*Early Hints*](https://frankenphp.dev/docs/early-hints/), [worker mode](https://frankenphp.dev/docs/worker/), [real-time capabilities](https://frankenphp.dev/docs/mercure/), automatic HTTPS, HTTP/2, and HTTP/3 support...
 
-FrankenPHP works with any PHP app and makes your Symfony and Laravel projects faster than ever thanks to the provided integration with the worker mode.
+FrankenPHP works with any PHP app and makes your Laravel and Symfony projects faster than ever thanks to their official integrations with the worker mode.
 
 FrankenPHP can also be used as a standalone Go library to embed PHP in any app using `net/http`.
 

+ 6 - 5
docs/config.md

@@ -6,7 +6,7 @@ In the Docker image, the `Caddyfile` is located at `/etc/caddy/Caddyfile`.
 
 You can also configure PHP using `php.ini` as usual.
 
-In the Docker image, the `php.ini` file is not present, you can create it or `COPY` manually:
+In the Docker image, the `php.ini` file is not present, you can create it manually  or copy an official template:
 
 ```dockerfile
 FROM dunglas/frankenphp
@@ -88,7 +88,8 @@ other.example.com {
 	root * /path/to/other/public
 	php_server
 }
-...
+
+# ...
 ```
 
 Using the `php_server` directive is generally what you need,
@@ -122,7 +123,7 @@ The `php_server` and the `php` directives have the following options:
 ```caddyfile
 php_server [<matcher>] {
 	root <directory> # Sets the root folder to the site. Default: `root` directive.
-	split_path <delim...> # Sets the substrings for splitting the URI into two parts. The first matching substring will be used to split the "path info" from the path. The first piece is suffixed with the matching substring and will be assumed as the actual resource (CGI script) name. The second piece will be set to PATH_INFO for the CGI script to use. Default: `.php`
+	split_path <delim...> # Sets the substrings for splitting the URI into two parts. The first matching substring will be used to split the "path info" from the path. The first piece is suffixed with the matching substring and will be assumed as the actual resource (CGI script) name. The second piece will be set to PATH_INFO for the script to use. Default: `.php`
 	resolve_root_symlink false # Disables resolving the `root` directory to its actual value by evaluating a symbolic link, if one exists (enabled by default).
 	env <key> <value> # Sets an extra environment variable to the given value. Can be specified more than once for multiple environment variables.
 }
@@ -136,9 +137,9 @@ The following environment variables can be used to inject Caddy directives in th
 * `CADDY_GLOBAL_OPTIONS`: inject [global options](https://caddyserver.com/docs/caddyfile/options)
 * `FRANKENPHP_CONFIG`: inject config under the `frankenphp` directive
 
-Unlike with FPM and CLI SAPIs, environment variables are **not** exposed by default in superglobals `$_SERVER` and `$_ENV`.
+As for FPM and CLI SAPIs, environment variables are exposed by default in the `$_SERVER` superglobal.
 
-To propagate environment variables to `$_SERVER` and `$_ENV`, set the `php.ini` `variables_order` directive to `EGPCS`.
+The `S` value of [the `variables_order` PHP directive](https://www.php.net/manual/en/ini.core.php#ini.variables-order) is always equivalent to `ES` regardless of the placement of `E` elsewhere in this directive.
 
 ## PHP config
 

+ 6 - 4
docs/docker.md

@@ -1,6 +1,8 @@
 # Building Custom Docker Image
 
-[FrankenPHP Docker images](https://hub.docker.com/r/dunglas/frankenphp) are based on [official PHP images](https://hub.docker.com/_/php/). Alpine Linux and Debian variants are provided for popular architectures. Variants for PHP 8.2 and PHP 8.3 are provided. [Browse tags](https://hub.docker.com/r/dunglas/frankenphp/tags).
+[FrankenPHP Docker images](https://hub.docker.com/r/dunglas/frankenphp) are based on [official PHP images](https://hub.docker.com/_/php/). Debian and Alpine Linux avariants are provided for popular architectures. Debian variants are recommended.
+
+Variants for PHP 8.2 and PHP 8.3 are provided. [Browse tags](https://hub.docker.com/r/dunglas/frankenphp/tags).
 
 ## How to Use The Images
 
@@ -12,7 +14,7 @@ FROM dunglas/frankenphp
 COPY . /app/public
 ```
 
-Then, run the commands to build and run the Docker image:
+Then, run these commands to build and run the Docker image:
 
 ```console
 docker build -t my-php-app .
@@ -65,8 +67,8 @@ FROM dunglas/frankenphp AS runner
 COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp
 ```
 
-The `builder` image provided by FrankenPHP contains a compiled version of libphp.
-[Builders images](https://hub.docker.com/r/dunglas/frankenphp/tags?name=builder) are provided for all versions of FrankenPHP and PHP, both for Alpine and Debian.
+The `builder` image provided by FrankenPHP contains a compiled version of `libphp`.
+[Builders images](https://hub.docker.com/r/dunglas/frankenphp/tags?name=builder) are provided for all versions of FrankenPHP and PHP, both for Debian and Alpine.
 
 > [!TIP]
 >

+ 4 - 4
docs/embed.md

@@ -4,7 +4,7 @@ FrankenPHP has the ability to embed the source code and assets of PHP applicatio
 
 Thanks to this feature, PHP applications can be distributed as standalone binaries that include the application itself, the PHP interpreter and Caddy, a production-level web server.
 
-Learn more about this feature [in the presentation made by Kévin at SymfonyCon](https://dunglas.dev/2023/12/php-and-symfony-apps-as-standalone-binaries/).
+Learn more about this feature [in the presentation made by Kévin at SymfonyCon 2023](https://dunglas.dev/2023/12/php-and-symfony-apps-as-standalone-binaries/).
 
 ## Preparing Your App
 
@@ -65,7 +65,7 @@ The easiest way to create a Linux binary is to use the Docker-based builder we p
     docker build -t static-app -f static-build.Dockerfile .
     ```
 
-3. Extract the binary
+3. Extract the binary:
 
     ```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
@@ -121,7 +121,7 @@ You can also run the PHP CLI scripts embedded in your binary:
 
 ## Distributing The Binary
 
-The created binary isn't compressed.
-To reduce the size of the file before sending it, you can compress it.
+On Linux, the created binary is compressed using [UPX](https://upx.github.io).
 
+On Mac, to reduce the size of the file before sending it, you can compress it.
 We recommend `xz`.

+ 177 - 0
docs/fr/CONTRIBUTING.md

@@ -0,0 +1,177 @@
+# Contribuer
+
+## Compiler PHP
+
+### Avec Docker (Linux)
+
+Construisez l'image Docker de développement :
+
+```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
+```
+
+L'image contient les outils de développement habituels (Go, GDB, Valgrind, Neovim...).
+
+Si la version de Docker est inférieure à 23.0, la construction échoue à cause d'un [problème de pattern](https://github.com/moby/moby/pull/42676) dans `.dockerignore`. Ajoutez les répertoires à `.dockerignore`.
+
+```patch
+ !testdata/*.php
+ !testdata/*.txt
++!caddy
++!C-Thread-Pool
++!internal
+```
+
+### Sans Docker (Linux et macOS)
+
+[Suivez les instructions pour compiler à partir des sources](compile.md) et passez l'indicateur de configuration `--debug`.
+
+## Exécution de la suite de tests
+
+```console
+go test -race -v ./...
+```
+
+## Module Caddy
+
+Construire Caddy avec le module FrankenPHP :
+
+```console
+cd caddy/frankenphp/
+go build
+cd ../../
+```
+
+Exécuter Caddy avec le module FrankenPHP :
+
+```console
+cd testdata/
+../caddy/frankenphp/frankenphp run
+```
+
+Le serveur est configuré pour écouter à l'adresse `127.0.0.1:8080`:
+
+```console
+curl -vk https://localhost/phpinfo.php
+```
+
+## Serveur de test minimal
+
+Construire le serveur de test minimal :
+
+```console
+cd internal/testserver/
+go build
+cd ../../
+```
+
+Lancer le test serveur :
+
+```console
+cd testdata/
+../internal/testserver/testserver
+```
+
+Le serveur est configuré pour écouter à l'adresse `127.0.0.1:8080`:
+
+```console
+curl -v http://127.0.0.1:8080/phpinfo.php
+```
+
+## Construire localement les images Docker
+
+Afficher le plan de compilation :
+
+```console
+docker buildx bake -f docker-bake.hcl --print
+```
+
+Construire localement les images FrankenPHP pour amd64 :
+
+```console
+docker buildx bake -f docker-bake.hcl --pull --load --set "*.platform=linux/amd64"
+```
+
+Construire localement les images FrankenPHP pour arm64 :
+
+```console
+docker buildx bake -f docker-bake.hcl --pull --load --set "*.platform=linux/arm64"
+```
+
+Construire à partir de zéro les images FrankenPHP pour arm64 & amd64 et les pousser sur Docker Hub :
+
+```console
+docker buildx bake -f docker-bake.hcl --pull --no-cache --push
+```
+
+## Déboguer les erreurs de segmentation dans GitHub Actions
+
+1. Ouvrir `.github/workflows/tests.yml`
+2. Activer les symboles de débogage de la bibliothèque PHP
+
+    ```patch
+        - uses: shivammathur/setup-php@v2
+          # ...
+          env:
+            phpts: ts
+    +       debug: true
+    ```
+
+3. Activer `tmate` pour se connecter au conteneur
+
+    ```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. Se connecter au conteneur
+5. Ouvrir `frankenphp.go`
+6. Activer `cgosymbolizer`
+
+    ```patch
+    - //_ "github.com/ianlancetaylor/cgosymbolizer"
+    + _ "github.com/ianlancetaylor/cgosymbolizer"
+    ```
+
+7. Télécharger le module : `go get`
+8. Dans le conteneur, vous pouvez utiliser GDB et similaires :
+
+    ```console
+    go test -c -ldflags=-w
+    gdb --args ./frankenphp.test -test.run ^MyTest$
+    ```
+
+9. Quand le bug est corrigé, annulez tous les changements
+
+## Ressources Diverses pour le Développement
+
+* [Intégration de PHP dans uWSGI](https://github.com/unbit/uwsgi/blob/master/plugins/php/php_plugin.c)
+* [Intégration de PHP dans NGINX Unit](https://github.com/nginx/unit/blob/master/src/nxt_php_sapi.c)
+* [Intégration de PHP dans Go (go-php)](https://github.com/deuill/go-php)
+* [Intégration de PHP dans Go (GoEmPHP)](https://github.com/mikespook/goemphp)
+* [Intégration de PHP dans C++](https://gist.github.com/paresy/3cbd4c6a469511ac7479aa0e7c42fea7)
+* [Extending and Embedding PHP par Sara Golemon](https://books.google.fr/books?id=zMbGvK17_tYC&pg=PA254&lpg=PA254#v=onepage&q&f=false)
+* [Qu'est-ce que TSRMLS_CC, au juste ?](http://blog.golemon.com/2006/06/what-heck-is-tsrmlscc-anyway.html)
+* [Intégration de PHP sur Mac](https://gist.github.com/jonnywang/61427ffc0e8dde74fff40f479d147db4)
+* [Bindings SDL](https://pkg.go.dev/github.com/veandco/go-sdl2@v0.4.21/sdl#Main)
+
+## Ressources Liées à Docker
+
+* [Définition du fichier Bake](https://docs.docker.com/build/customize/bake/file-definition/)
+* [docker buildx build](https://docs.docker.com/engine/reference/commandline/buildx_build/)
+
+## Commande utile
+
+```console
+apk add strace util-linux gdb
+strace -e 'trace=!futex,epoll_ctl,epoll_pwait,tgkill,rt_sigreturn' -p 1
+```

+ 77 - 0
docs/fr/README.md

@@ -0,0 +1,77 @@
+# FrankenPHP : le serveur d'applications PHP moderne, écrit en Go
+
+<h1 align="center"><a href="https://frankenphp.dev"><img src="../../frankenphp.png" alt="FrankenPHP" width="600"></a></h1>
+
+FrankenPHP est un serveur d'applications moderne pour PHP construit à partir du serveur web [Caddy](https://caddyserver.com/).
+
+FrankenPHP donne des super-pouvoirs à vos applications PHP grâce à ses fonctionnalités à la pointe : [*Early Hints*](early-hints.md), [mode worker](worker.md), [fonctionnalités en temps réel](mercure.md), HTTPS automatique, prise en charge de HTTP/2 et HTTP/3...
+
+FrankenPHP fonctionne avec n'importe quelle application PHP et rend vos projets Laravel et Symfony plus rapides que jamais grâce à leurs intégrations officielles avec le mode worker.
+
+FrankenPHP peut également être utilisé comme une bibliothèque Go autonome qui permet d'intégrer PHP dans n'importe quelle application en utilisant `net/http`.
+
+Découvrez plus de détails sur ce serveur d’application dans le replay de cette conférence donnée au Forum PHP 2022 :
+
+<a href="https://dunglas.dev/2022/10/frankenphp-the-modern-php-app-server-written-in-go/"><img src="https://dunglas.dev/wp-content/uploads/2022/10/frankenphp.png" alt="Diapositives" width="600"></a>
+
+## Pour Commencer
+
+### Docker
+
+```console
+docker run -v $PWD:/app/public \
+    -p 80:80 -p 443:443 -p 443:443/udp \
+    dunglas/frankenphp
+```
+
+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é.
+> Utilisez [la variable d'environnement `SERVER_NAME`](config.md#environment-variables) pour changer le domaine à utiliser.
+
+### Binaire autonome
+
+Si vous préférez ne pas utiliser Docker, nous fournissons des binaires autonomes de FrankenPHP pour Linux et macOS
+contenant [PHP 8.3](https://www.php.net/releases/8.3/fr.php) et la plupart des extensions PHP populaires : [Télécharger FrankenPHP](https://github.com/dunglas/frankenphp/releases)
+
+Pour servir le contenu du répertoire courant, exécutez :
+
+```console
+./frankenphp php-server
+```
+
+Vous pouvez également exécuter des scripts en ligne de commande avec :
+
+```console
+./frankenphp php-cli /path/to/your/script.php
+```
+
+## Documentation
+
+* [Le mode worker](worker.md)
+* [Le support des Early Hints (code de statut HTTP 103)](early-hints.md)
+* [Temps réel](mercure.md)
+* [Configuration](config.md)
+* [Images Docker](docker.md)
+* [Déploiement en production](production.md)
+* [Créer des applications PHP **standalone**, auto-exécutables](embed.md)
+* [Créer un build statique](static.md)
+* [Compiler depuis les sources](compile.md)
+* [Intégration Laravel](laravel.md)
+* [Problèmes connus](known-issues.md)
+* [Application de démo (Symfony) et benchmarks](https://github.com/dunglas/frankenphp-demo)
+* [Documentation de la bibliothèque Go](https://pkg.go.dev/github.com/dunglas/frankenphp)
+* [Contribuer et débugger](CONTRIBUTING.md)
+
+## Exemples et squelettes
+
+* [Symfony](https://github.com/dunglas/symfony-docker)
+* [API Platform](https://api-platform.com/docs/distribution/)
+* [Laravel](laravel.md)
+* [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)

+ 101 - 0
docs/fr/compile.md

@@ -0,0 +1,101 @@
+# Compiler depuis les sources
+
+Ce document explique comment créer un build FrankenPHP qui chargera PHP comme une bibliothèque dynamique. C'est la méthode recommandée.
+
+En alternative, il est aussi possible de [créer des builds statiques](static.md).
+
+## Installer PHP
+
+FrankenPHP est compatible avec PHP 8.2 et versions ultérieures.
+
+Tout d'abord, [téléchargez les sources de PHP](https://www.php.net/downloads.php) et extrayez-les :
+
+```console
+tar xf php-*
+cd php-*/
+```
+
+Ensuite, configurez PHP pour votre système d'exploitation :
+
+### Linux
+
+```console
+./configure \
+    --enable-embed \
+    --enable-zts \
+    --disable-zend-signals \
+    --enable-zend-max-execution-timers
+```
+
+Finalement, compilez et installez PHP :
+
+```console
+make -j$(nproc)
+sudo make install
+```
+
+### Mac
+
+Utilisez le gestionnaire de paquets [Homebrew](https://brew.sh/) pour installer `libiconv`, `bison`, `re2c` et `pkg-config` :
+
+```console
+brew install libiconv bison re2c pkg-config
+echo 'export PATH="/opt/homebrew/opt/bison/bin:$PATH"' >> ~/.zshrc
+```
+
+Puis exécutez le script de configuration :
+
+```console
+./configure \
+    --enable-embed=static \
+    --enable-zts \
+    --disable-zend-signals \
+    --disable-opcache-jit \
+    --enable-static \
+    --enable-shared=no \
+    --with-iconv=/opt/homebrew/opt/libiconv/
+```
+
+Les options de configuration spécifiées sont nécessaires pour la compilation, mais vous pouvez également inclure d'autres options selon vos besoins, par exemple pour ajouter des extensions supplémentaires.
+
+Finalement, compilez et installez PHP :
+
+```console
+make -j$(sysctl -n hw.logicalcpu)
+sudo make install
+```
+
+## Compiler l'application Go
+
+Vous pouvez maintenant utiliser la bibliothèque Go et compiler notre build de Caddy :
+
+```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
+```
+
+### Utiliser xcaddy
+
+Vous pouvez utiliser à la place [xcaddy](https://github.com/caddyserver/xcaddy) pour compiler FrankenPHP avec [des modules Caddy additionnels](https://caddyserver.com/docs/modules/):
+
+```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]
+>
+> Si vous utilisez musl libc (la bibliothèque par défaut sur Alpine Linux) et Symfony,
+> vous pourriez avoir besoin d'augmenter la taille par défaut de la pile.
+> Sinon, vous pourriez rencontrer des erreurs telles que `PHP Fatal error: Maximum call stack size of 83360 bytes reached during compilation. Try splitting expression`
+>
+> Pour ce faire, modifiez la variable d'environnement `XCADDY_GO_BUILD_FLAGS` en quelque chose comme
+> `XCADDY_GO_BUILD_FLAGS=$'-ldflags "-w -s -extldflags \'-Wl,-z,stack-size=0x80000\'"'`
+> (modifiez la valeur de la taille de la pile selon les besoins de votre application).

+ 158 - 0
docs/fr/config.md

@@ -0,0 +1,158 @@
+# Configuration
+
+FrankenPHP, Caddy ainsi que les modules Mercure et Vulcain peuvent être configurés en utilisant [les formats pris en charge par Caddy](https://caddyserver.com/docs/getting-started#your-first-config).
+
+Dans l'image Docker, le chemin du `Caddyfile` est `/etc/caddy/Caddyfile`.
+
+Vous pouvez également configurer PHP en utilisant `php.ini` comme d'habitude.
+
+Dans l'image Docker, le fichier `php.ini` n'est pas présent, vous pouvez le créer manuellement ou copier un template officiel :
+
+```dockerfile
+FROM dunglas/frankenphp
+
+# Développement :
+RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini
+
+# Ou production :
+RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini
+```
+
+## Configuration du Caddyfile
+
+Pour enregistrer l'exécutable de FrankenPHP, l'[option globale](https://caddyserver.com/docs/caddyfile/concepts#global-options) `frankenphp` doit être définie, puis les [directives HTTP](https://caddyserver.com/docs/caddyfile/concepts#directives) `php_server` ou `php` peuvent être utilisées dans les blocs de site pour servir votre application PHP.
+
+Exemple minimal :
+
+```caddyfile
+{
+ # Activer FrankenPHP
+ frankenphp
+ # Configurer l'ordre d'exécution de la directive
+ order php_server before file_server
+}
+
+localhost {
+ # Activer la compression (optionnel)
+ encode zstd br gzip
+ # Exécuter les fichiers PHP dans le répertoire courant et servir les assets
+ php_server
+}
+```
+
+En option, le nombre de threads à créer et les [workers](worker.md) à démarrer avec le serveur peuvent être spécifiés sous l'option globale.
+
+```caddyfile
+{
+ frankenphp {
+  num_threads <num_threads> # Définit le nombre de threads PHP à démarrer. Par défaut : 2x le nombre de CPUs disponibles.
+  worker {
+   file <path> # Définit le chemin vers le script worker.
+   num <num> # Définit le nombre de threads PHP à démarrer, par défaut 2x le nombre de CPUs disponibles.
+   env <key> <value> # Définit une variable d'environnement supplémentaire avec la valeur donnée. Peut être spécifié plusieurs fois pour régler plusieurs variables d'environnement.
+  }
+ }
+}
+
+# ...
+```
+
+Vous pouvez également utiliser la forme courte de l'option worker en une seule ligne :
+
+```caddyfile
+{
+ frankenphp {
+  worker <file> <num>
+ }
+}
+
+# ...
+```
+
+Vous pouvez aussi définir plusieurs workers si vous servez plusieurs applications sur le même serveur :
+
+```caddyfile
+{
+ frankenphp {
+  worker /path/to/app/public/index.php <num>
+  worker /path/to/other/public/index.php <num>
+ }
+}
+
+app.example.com {
+ root * /path/to/app/public
+ php_server
+}
+
+other.example.com {
+ root * /path/to/other/public
+ php_server
+}
+
+# ...
+```
+
+L'utilisation de la directive `php_server` est généralement suffisante,
+mais si vous avez besoin d'un contrôle total, vous pouvez utiliser la directive `php`, qui permet un plus grand niveau de finesse dans la configuration.
+
+Utiliser la directive `php_server` est équivalent à cette configuration :
+
+```caddyfile
+route {
+ # Ajoute un slash final pour les requêtes de répertoire
+ @canonicalPath {
+  file {path}/index.php
+  not path */
+ }
+ redir @canonicalPath {path}/ 308
+ # Si le fichier demandé n'existe pas, essayer les fichiers index
+ @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
+}
+```
+
+Les directives `php_server` et `php` disposent des options suivantes :
+
+```caddyfile
+php_server [<matcher>] {
+ root <directory> # Définit le dossier racine du le site. Par défaut : valeur de la directive `root` parente.
+ split_path <delim...> # Définit les sous-chaînes pour diviser l'URI en deux parties. La première sous-chaîne correspondante sera utilisée pour séparer le "path info" du chemin. La première partie est suffixée avec la sous-chaîne correspondante et sera considérée comme le nom réel de la ressource (script CGI). La seconde partie sera définie comme PATH_INFO pour utilisation par le script. Par défaut : `.php`
+ resolve_root_symlink false # Désactive la résolution du répertoire `root` vers sa valeur réelle en évaluant un lien symbolique, s'il existe (activé par défaut).
+ env <key> <value> # Définit une variable d'environnement supplémentaire avec la valeur donnée. Peut être spécifié plusieurs fois pour plusieurs variables d'environnement.
+}
+```
+
+## Variables d'environnement
+
+Les variables d'environnement suivantes peuvent être utilisées pour insérer des directives Caddy dans le `Caddyfile` sans le modifier :
+
+* `SERVER_NAME` : change [les adresses sur lesquelles écouter](https://caddyserver.com/docs/caddyfile/concepts#addresses), les noms d'hôte fournis seront également utilisés pour le certificat TLS généré
+* `CADDY_GLOBAL_OPTIONS` : injecte [des options globales](https://caddyserver.com/docs/caddyfile/options)
+* `FRANKENPHP_CONFIG` : insère la configuration sous la directive `frankenphp`
+
+Comme pour les SAPI FPM et CLI, les variables d'environnement ne sont exposées par défaut dans la superglobale `$_SERVER`.
+
+La valeur `S` de [la directive `variables_order` de PHP](https://www.php.net/manual/fr/ini.core.php#ini.variables-order) est toujours équivalente à `ES`, que `E` soit défini ailleurs dans cette directive ou non.
+
+## Configuration PHP
+
+Pour charger [des fichiers de configuration PHP supplémentaires](https://www.php.net/manual/fr/configuration.file.php#configuration.file.scan), la variable d'environnement `PHP_INI_SCAN_DIR` peut être utilisée.
+Lorsqu'elle est définie, PHP chargera tous les fichiers avec l'extension `.ini` présents dans les répertoires donnés.
+
+## Activer le mode debug
+
+Lors de l'utilisation de l'image Docker, définissez la variable d'environnement `CADDY_GLOBAL_OPTIONS` sur `debug` pour activer le mode debug :
+
+```console
+docker run -v $PWD:/app/public \
+    -e CADDY_GLOBAL_OPTIONS=debug \
+    -p 80:80 -p 443:443 -p 443:443/udp \
+    dunglas/frankenphp
+```

+ 165 - 0
docs/fr/docker.md

@@ -0,0 +1,165 @@
+# Création d'une image Docker personnalisée
+
+Les images Docker de [FrankenPHP](https://hub.docker.com/r/dunglas/frankenphp) sont basées sur les [images PHP officielles](https://hub.docker.com/_/php/). Des variantes Debian et Alpine Linux sont fournies pour les architectures populaires. Les variantes Debian sont recommandées.
+
+Des variantes pour PHP 8.2 et PHP 8.3 sont disponibles. [Parcourir les tags](https://hub.docker.com/r/dunglas/frankenphp/tags).
+
+## Comment utiliser les images
+
+Créez un `Dockerfile` dans votre projet :
+
+```dockerfile
+FROM dunglas/frankenphp
+
+COPY . /app/public
+```
+
+Ensuite, exécutez ces commandes pour construire et exécuter l'image Docker :
+
+```console
+docker build -t my-php-app .
+docker run -it --rm --name my-running-app my-php-app
+```
+
+## Comment installer plus d'extensions PHP
+
+Le script [`docker-php-extension-installer`](https://github.com/mlocati/docker-php-extension-installer) est fourni dans l'image de base.
+Il est facile d'ajouter des extensions PHP supplémentaires :
+
+```dockerfile
+FROM dunglas/frankenphp
+
+# ajoutez des extensions supplémentaires ici :
+RUN install-php-extensions \
+ pdo_mysql \
+ gd \
+ intl \
+ zip \
+ opcache
+```
+
+## Comment installer plus de modules Caddy
+
+FrankenPHP est construit sur Caddy, et tous les [modules Caddy](https://caddyserver.com/docs/modules/) peuvent être utilisés avec FrankenPHP.
+
+La manière la plus simple d'installer des modules Caddy personnalisés est d'utiliser [xcaddy](https://github.com/caddyserver/xcaddy):
+
+```dockerfile
+FROM dunglas/frankenphp:latest-builder AS builder
+
+# Copier xcaddy dans l'image du constructeur
+COPY --from=caddy:builder /usr/bin/xcaddy /usr/bin/xcaddy
+
+# CGO doit être activé pour construire FrankenPHP
+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 et Vulcain sont inclus dans la construction officielle, mais n'hésitez pas à les retirer
+	--with github.com/dunglas/mercure/caddy \
+	--with github.com/dunglas/vulcain/caddy
+	# Ajoutez des modules Caddy supplémentaires ici
+
+FROM dunglas/frankenphp AS runner
+
+# Remplacer le binaire officiel par celui contenant vos modules personnalisés
+COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp
+```
+
+L'image builder fournie par FrankenPHP contient une version compilée de `libphp`.
+[Les images builder](https://hub.docker.com/r/dunglas/frankenphp/tags?name=builder) sont fournies pour toutes les versions de FrankenPHP et PHP, à la fois pour Debian et Alpine.
+
+> [!TIP]
+>
+> Si vous utilisez Alpine Linux et Symfony,
+> vous devrez peut-être [augmenter la taille de pile par défaut](compile.md#using-xcaddy).
+
+## Activer le mode Worker par défaut
+
+Définissez la variable d'environnement `FRANKENPHP_CONFIG` pour démarrer FrankenPHP avec un script worker :
+
+```dockerfile
+FROM dunglas/frankenphp
+
+# ...
+
+ENV FRANKENPHP_CONFIG="worker ./public/index.php"
+```
+
+## Utiliser un volume en développement
+
+Pour développer facilement avec FrankenPHP, montez le répertoire de l'hôte contenant le code source de l'application comme un volume dans le conteneur Docker :
+
+```console
+docker run -v $PWD:/app/public -p 80:80 -p 443:443 -p 443:443/udp --tty my-php-app
+```
+
+> ![TIP]
+>
+> L'option --tty permet d'avoir des logs lisibles par un humain au lieu de logs JSON.
+
+Avec Docker Compose :
+
+```yaml
+# compose.yaml
+
+services:
+  php:
+    image: dunglas/frankenphp
+    # décommentez la ligne suivante si vous souhaitez utiliser un Dockerfile personnalisé
+    #build: .
+    # décommentez la ligne suivante si vous souhaitez exécuter ceci dans un environnement de production
+    # restart: always
+    ports:
+      - "80:80" # HTTP
+      - "443:443" # HTTPS
+      - "443:443/udp" # HTTP/3
+    volumes:
+      - ./:/app/public
+      - caddy_data:/data
+      - caddy_config:/config
+    # commentez la ligne suivante en production, elle permet d'avoir de beaux logs lisibles en dev
+    tty: true
+
+# Volumes nécessaires pour les certificats et la configuration de Caddy
+volumes:
+  caddy_data:
+  caddy_config:
+```
+
+## Exécution en tant qu'utilisateur non-root
+
+FrankenPHP peut s'exécuter en tant qu'utilisateur non-root dans Docker.
+
+Voici un exemple de `Dockerfile` le permettant :
+
+```dockerfile
+FROM dunglas/frankenphp
+
+ARG USER=www-data
+
+RUN \
+ # Utilisez "adduser -D ${USER}" pour les distributions basées sur Alpine
+ useradd -D ${USER}; \
+ # Ajouter la capacité supplémentaire de se lier aux ports 80 et 443
+ setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/frankenphp; \
+ # Donner l'accès en écriture à /data/caddy et /config/caddy
+ chown -R ${USER}:${USER} /data/caddy && chown -R ${USER}:${USER} /config/caddy;
+
+USER ${USER}
+```
+
+## Mises à jour
+
+Les images Docker sont construites :
+
+* lorsqu'une nouvelle version est taguée
+* tous les jours à 4h UTC, si de nouvelles versions des images officielles PHP sont disponibles
+
+## Versions de développement
+
+Les versions de développement sont disponibles dans le dépôt Docker [`dunglas/frankenphp-dev`](https://hub.docker.com/repository/docker/dunglas/frankenphp-dev). Un nouveau build est déclenché chaque fois qu'un commit est poussé sur la branche principale du dépôt GitHub.
+
+Les tags `latest*` pointent vers la tête de la branche `main`.
+Les tags sous la forme `sha-<hash-du-commit-git>` sont également disponibles.

+ 21 - 0
docs/fr/early-hints.md

@@ -0,0 +1,21 @@
+# Early Hints
+
+FrankenPHP prend nativement en charge le code de statut [103 Early Hints](https://developer.chrome.com/blog/early-hints/).
+L'utilisation des Early Hints peut améliorer le temps de chargement de vos pages web de 30 %.
+
+```php
+<?php
+
+header('Link: </style.css>; rel=preload; as=style');
+headers_send(103);
+
+// vos algorithmes lents et requêtes SQL 🤪
+
+echo <<<'HTML'
+<!DOCTYPE html>
+<title>Hello FrankenPHP</title>
+<link rel="stylesheet" href="style.css">
+HTML;
+```
+
+Les Early Hints sont pris en charge à la fois par les modes "standard" et [worker](worker.md).

Some files were not shown because too many files changed in this diff