Sponsorisé par
Contribuer

Contribuer

# Compiler PHP

# Avec Docker (Linux)

Construisez l’image Docker de développement :

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 dans .dockerignore. Ajoutez les répertoires à .dockerignore.

 !testdata/*.php
 !testdata/*.txt
+!caddy
+!internal

# Sans Docker (Linux et macOS)

Suivez les instructions pour compiler à partir des sources et passez l’indicateur de configuration --debug.

# Exécution de la suite de tests

go test -tags watcher -race -v ./...

# Module Caddy

Construire Caddy avec le module FrankenPHP :

cd caddy/frankenphp/
go build
cd ../../

Exécuter Caddy avec le module FrankenPHP :

cd testdata/
../caddy/frankenphp/frankenphp run

Le serveur est configuré pour écouter à l’adresse 127.0.0.1:8080:

curl -vk https://localhost/phpinfo.php

# Serveur de test minimal

Construire le serveur de test minimal :

cd internal/testserver/
go build
cd ../../

Lancer le test serveur :

cd testdata/
../internal/testserver/testserver

Le serveur est configuré pour écouter à l’adresse 127.0.0.1:8080:

curl -v http://127.0.0.1:8080/phpinfo.php

# Construire localement les images Docker

Afficher le plan de compilation :

docker buildx bake -f docker-bake.hcl --print

Construire localement les images FrankenPHP pour amd64 :

docker buildx bake -f docker-bake.hcl --pull --load --set "*.platform=linux/amd64"

Construire localement les images FrankenPHP pour arm64 :

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 :

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

        - uses: shivammathur/setup-php@v2
          # ...
          env:
            phpts: ts
    +       debug: true
    
  3. Activer tmate pour se connecter au conteneur

        -
          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

    - //_ "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 :

    go test -tags watcher -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

# Ressources Liées à Docker

# Commande utile

apk add strace util-linux gdb
strace -e 'trace=!futex,epoll_ctl,epoll_pwait,tgkill,rt_sigreturn' -p 1
Editer cette page