Build the dev Docker image:
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
The image contains the usual development tools (Go, GDB, Valgrind, Neovim...).
If docker version is lower than 23.0, build is failed by dockerignore pattern issue. Add directories to .dockerignore
.
!testdata/*.php
!testdata/*.txt
+!caddy
+!internal
Follow the instructions to compile from sources and pass the --debug
configuration flag.
go test -tags watcher -race -v ./...
Build Caddy with the FrankenPHP Caddy module:
cd caddy/frankenphp/
go build -tags watcher,brotli,nobadger,nomysql,nopgx
cd ../../
Run the Caddy with the FrankenPHP Caddy module:
cd testdata/
../caddy/frankenphp/frankenphp run
The server is listening on 127.0.0.1:8080
:
curl -vk https://localhost/phpinfo.php
Build the minimal test server:
cd internal/testserver/
go build
cd ../../
Run the test server:
cd testdata/
../internal/testserver/testserver
The server is listening on 127.0.0.1:8080
:
curl -v http://127.0.0.1:8080/phpinfo.php
Print bake plan:
docker buildx bake -f docker-bake.hcl --print
Build FrankenPHP images for amd64 locally:
docker buildx bake -f docker-bake.hcl --pull --load --set "*.platform=linux/amd64"
Build FrankenPHP images for arm64 locally:
docker buildx bake -f docker-bake.hcl --pull --load --set "*.platform=linux/arm64"
Build FrankenPHP images from scratch for arm64 & amd64 and push to Docker Hub:
docker buildx bake -f docker-bake.hcl --pull --no-cache --push
Download the debug version of the FrankenPHP binary from GitHub or create your custom static build including debug symbols:
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
Replace your current version of frankenphp
by the debug FrankenPHP executable
Start FrankenPHP as usual (alternatively, you can directly start FrankenPHP with GDB: gdb --args frankenphp run
)
Attach to the process with GDB:
gdb -p `pidof frankenphp`
If necessary, type continue
in the GDB shell
Make FrankenPHP crash
Type bt
in the GDB shell
Copy the output
.github/workflows/tests.yml
Enable PHP debug symbols
- uses: shivammathur/setup-php@v2
# ...
env:
phpts: ts
+ debug: true
Enable tmate
to connect to the container
-
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
Connect to the container
Open frankenphp.go
Enable cgosymbolizer
- //_ "github.com/ianlancetaylor/cgosymbolizer"
+ _ "github.com/ianlancetaylor/cgosymbolizer"
Download the module: go get
In the container, you can use GDB and the like:
go test -tags watcher -c -ldflags=-w
gdb --args frankenphp.test -test.run ^MyTest$
When the bug is fixed, revert all these changes
apk add strace util-linux gdb
strace -e 'trace=!futex,epoll_ctl,epoll_pwait,tgkill,rt_sigreturn' -p 1
To translate the documentation and the site in a new language, follow these steps:
docs/
directory.md
files in the root of the docs/
directory into the new directory (always use the English version as source for translation, as it's always up to date)README.md
and CONTRIBUTING.md
files from the root directory to the new directory> [!
(it's special markup for GitHub)content/
, data/
and i18n/
directories