Contributing
Compiling PHP
With Docker (Linux)
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
Without Docker (Linux and macOS)
Follow the instructions to compile from sources and pass the --debug configuration flag.
Running the test suite
go test -tags watcher -race -v ./...
Caddy module
Build Caddy with the FrankenPHP Caddy module:
cd caddy/frankenphp/go build -tags watcher,brotli,nobadger,nomysql,nopgxcd ../../
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
Minimal test server
Build the minimal test server:
cd internal/testserver/go buildcd ../../
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
Building Docker Images Locally
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
Debugging Segmentation Faults With Static Builds
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-builderdocker cp $(docker create --name static-builder dunglas/frankenphp:static-builder):/go/src/app/dist/frankenphp-linux-$(uname -m) frankenphp
Replace your current version of
frankenphpby the debug FrankenPHP executableStart 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
continuein the GDB shellMake FrankenPHP crash
Type
btin the GDB shellCopy the output
Debugging Segmentation Faults in GitHub Actions
Open
.github/workflows/tests.ymlEnable PHP debug symbols
- uses: shivammathur/setup-php@v2# ...env:phpts: ts+ debug: true
Enable
tmateto connect to the container-name: Set CGO flagsrun: 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.goEnable
cgosymbolizer- //_ "github.com/ianlancetaylor/cgosymbolizer"+ _ "github.com/ianlancetaylor/cgosymbolizer"
Download the module:
go getIn the container, you can use GDB and the like:
go test -tags watcher -c -ldflags=-wgdb --args frankenphp.test -test.run ^MyTest$
When the bug is fixed, revert all these changes
Misc Dev Resources
- PHP embedding in uWSGI
- PHP embedding in NGINX Unit
- PHP embedding in Go (go-php)
- PHP embedding in Go (GoEmPHP)
- PHP embedding in C++
- Extending and Embedding PHP by Sara Golemon
- What the heck is TSRMLS_CC, anyway?
- PHP embedding on Mac
- SDL bindings
Docker-Related Resources
Useful Command
apk add strace util-linux gdbstrace -e 'trace=!futex,epoll_ctl,epoll_pwait,tgkill,rt_sigreturn' -p 1
Translating the Documentation
To translate the documentation and the site in a new language, follow these steps:
- Create a new directory named with the language’s 2-character ISO code in this repository’s
docs/directory - Copy all the
.mdfiles in the root of thedocs/directory into the new directory (always use the English version as source for translation, as it’s always up to date) - Copy the
README.mdandCONTRIBUTING.mdfiles from the root directory to the new directory - Translate the content of the files, but don’t change the filenames, also don’t translate strings starting with
> [!(it’s special markup for GitHub) - Create a Pull Request with the translations
- In the site repository, copy and translate the translation files in the
content/,data/andi18n/directories - Translate the values in the created YAML file
- Open a Pull Request on the site repository
