6.8 KiB
Contribuindo
Compilando o PHP
Com Docker (Linux)
Crie a imagem Docker de desenvolvimento:
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
A imagem contém as ferramentas de desenvolvimento usuais (Go, GDB, Valgrind, Neovim...) e usa os seguintes locais de configuração do PHP:
- php.ini:
/etc/frankenphp/php.ini. Um arquivophp.inicom configurações de desenvolvimento é fornecido por padrão. - Arquivos de configuração adicionais:
/etc/frankenphp/php.d/*.ini. - Extensões PHP:
/usr/lib/frankenphp/modules/.
Se a sua versão do Docker for anterior à 23.0, a compilação falhará devido ao
problema de padrão do .dockerignore.
Adicione diretórios ao .dockerignore.
!testdata/*.php
!testdata/*.txt
+!caddy
+!internal
Sem Docker (Linux e macOS)
Siga as instruções para compilar a partir do código-fonte e passe
a flag de configuração --debug.
Executando a suite de testes
go test -race -v ./...
Módulo Caddy
Construa o Caddy com o módulo Caddy FrankenPHP:
cd caddy/frankenphp/
go build -tags nobadger,nomysql,nopgx
cd ../../
Execute o Caddy com o módulo Caddy FrankenPHP:
cd testdata/
../caddy/frankenphp/frankenphp run
O servidor está escutando em 127.0.0.1:80:
Note
Se você estiver usando o Docker, terá que vincular a porta 80 do contêiner ou executar de dentro do contêiner.
curl -vk http://127.0.0.1/phpinfo.php
Servidor de teste mínimo
Construa o servidor de teste mínimo:
cd internal/testserver/
go build
cd ../../
Execute o servidor de teste:
cd testdata/
../internal/testserver/testserver
O servidor está escutando em 127.0.0.1:8080:
curl -v http://127.0.0.1:8080/phpinfo.php
Construindo imagens Docker localmente
Imprima o plano do bake:
docker buildx bake -f docker-bake.hcl --print
Construa imagens FrankenPHP para amd64 localmente:
docker buildx bake -f docker-bake.hcl --pull --load --set "*.platform=linux/amd64"
Construa imagens FrankenPHP para arm64 localmente:
docker buildx bake -f docker-bake.hcl --pull --load --set "*.platform=linux/arm64"
Construa imagens FrankenPHP do zero para arm64 e amd64 e envie para o Docker Hub:
docker buildx bake -f docker-bake.hcl --pull --no-cache --push
Depurando falhas de segmentação com compilações estáticas
-
Baixe a versão de depuração do binário do FrankenPHP do GitHub ou crie sua própria compilação estática personalizada, incluindo símbolos de depuração:
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-musl dunglas/frankenphp:static-builder-musl):/go/src/app/dist/frankenphp-linux-$(uname -m) frankenphp -
Substitua sua versão atual do
frankenphppelo executável de depuração do FrankenPHP. -
Inicie o FrankenPHP normalmente (alternativamente, você pode iniciar o FrankenPHP diretamente com o GDB:
gdb --args frankenphp run). -
Anexe ao processo com o GDB:
gdb -p `pidof frankenphp` -
Se necessário, digite
continueno shell do GDB. -
Faça o FrankenPHP travar.
-
Digite
btno shell do GDB. -
Copie a saída.
Depurando falhas de segmentação no GitHub Actions
-
Abra o arquivo
.github/workflows/tests.yml. -
Habilite os símbolos de depuração do PHP:
- uses: shivammathur/setup-php@v2 # ... env: phpts: ts + debug: true -
Habilite o
tmatepara se conectar ao contêiner:- 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 -
Conecte-se ao contêiner.
-
Abra o
frankenphp.go. -
Habilite o
cgosymbolizer:- //_ "github.com/ianlancetaylor/cgosymbolizer" + _ "github.com/ianlancetaylor/cgosymbolizer" -
Baixe o módulo:
go get. -
No contêiner, você pode usar o GDB e similares:
go test -c -ldflags=-w gdb --args frankenphp.test -test.run ^MyTest$ -
Quando a falha for corrigida, reverta todas essas alterações.
Recursos diversos de desenvolvimento
- 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, por Sara Golemon
- What the heck is TSRMLS_CC, anyway?
- SDL bindings
Recursos relacionados ao Docker
Comando útil
apk add strace util-linux gdb
strace -e 'trace=!futex,epoll_ctl,epoll_pwait,tgkill,rt_sigreturn' -p 1
Traduzindo a documentação
Para traduzir a documentação e o site para um novo idioma, siga estes passos:
- Crie um novo diretório com o código ISO de 2 caracteres do idioma no
diretório
docs/deste repositório. - Copie todos os arquivos
.mdda raiz do diretóriodocs/para o novo diretório (sempre use a versão em inglês como fonte para tradução, pois está sempre atualizada). - Copie os arquivos
README.mdeCONTRIBUTING.mddo diretório raiz para o novo diretório. - Traduza o conteúdo dos arquivos, mas não altere os nomes dos arquivos, nem
traduza strings que comecem com
> [!(é uma marcação especial para o GitHub). - Crie um pull request com as traduções.
- No
repositório do site,
copie e traduza os arquivos de tradução nos diretórios
content/,data/ei18n/. - Traduza os valores no arquivo YAML criado.
- Abra um pull request no repositório do site.